summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authoryjun2022-05-17 12:16:32 +0800
committeryjun2022-05-17 12:16:32 +0800
commitd66c7d0fc0b35270f9fe591a311563cc0d851555 (patch)
tree78708ccbe7b46d0494838100815004e5f5fff152
parentdf61abd38d06cbb1f4eca16f1e070d986a8b6dbd (diff)
downloadaur-d66c7d0fc0b35270f9fe591a311563cc0d851555.tar.gz
updpkg: linux-tqc-a01 5.17.7
-rw-r--r--.SRCINFO90
-rw-r--r--0001-HACK-h6-Add-HDMI-sound-card.patch53
-rw-r--r--0005-drm-gem-cma-Export-with-handle-allocator.patch50
-rw-r--r--0006-drm-sun4i-Add-GEM-allocator.patch102
-rw-r--r--0009-allwinner-h6-support-ac200-audio-codec.patch1878
-rw-r--r--0010-allwinner-add-sunxi_get_soc_chipid-and-sunxi_get_ser.patch59
-rw-r--r--0010-general-h6-add-dma-i2c-ir-spi-uart.patch107
-rw-r--r--0012-arm64-h6-gpu-devfreq-enable.patch2
-rw-r--r--0012-fix-h6-emmc.patch38
-rw-r--r--0013-x-fix-h6-emmc-dts.patch23
-rw-r--r--0040-wip-H6-deinterlace.patch1364
-rw-r--r--0041-arm64-dts-h6-deinterlace.patch32
-rw-r--r--HACK-media-uapi-hevc-tiles-and-num_slices.patch37
-rw-r--r--PKGBUILD148
-rw-r--r--Revert-net-Remove-net-ipx.h-and-uapi-linux-ipx.h-hea.patch287
-rw-r--r--WIP-media-uapi-hevc-add-fields-needed-for-rkvdec.patch66
-rw-r--r--arm64-dts-allwinner-h6-Add-SCPI-protocol.patch51
-rw-r--r--arm64-dts-allwinner-h6-Add-hdmi-sound-card.patch48
-rw-r--r--arm64-dts-allwinner-h6-Protect-SCP-clocks.patch33
-rw-r--r--arm64-dts-sun50i-h6-Add-AC200-EPHY-related-nodes.patch (renamed from 0003-arm64-dts-allwinner-h6-Add-AC200-EPHY-related-nodes.patch)44
-rw-r--r--arm64-dts-sun50i-h6.dtsi-improve-thermals.patch111
-rw-r--r--config497
-rw-r--r--drv-media-cedrus-10-bit-HEVC-support.patch170
-rw-r--r--drv-media-cedrus-Add-callback-for-buffer-cleanup.patch57
-rw-r--r--drv-media-cedrus-h264-Improve-buffer-management.patch208
-rw-r--r--drv-media-cedrus-hevc-Improve-buffer-management.patch245
-rw-r--r--drv-media-cedrus-hevc-tiles-hack.patch180
-rw-r--r--drv-mfd-Add-support-for-AC200.patch (renamed from 0001-mfd-Add-support-for-AC200.patch)18
-rw-r--r--drv-net-phy-Add-support-for-AC200-EPHY.patch (renamed from 0002-net-phy-Add-support-for-AC200-EPHY.patch)22
-rw-r--r--drv-pinctrl-sunxi-pinctrl-sun50i-h6.c-GPIO-disable_strict_mode.patch25
-rw-r--r--fastgit_wget.sh3
-rw-r--r--net-stmmac-sun8i-Add-support-for-enabling-a-regulator-for-PHY-I.patch (renamed from 0004-net-stmmac-sun8i-Add-support-for-enabling-a-regulato.patch)30
-rw-r--r--net-stmmac-sun8i-Rename-PHY-regulator-variable-to-regulator_phy.patch (renamed from 0003-net-stmmac-sun8i-Rename-PHY-regulator-variable-to-re.patch)26
-rw-r--r--net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regulator.patch (renamed from 0002-net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regu.patch)20
-rw-r--r--patches-links.txt3
-rw-r--r--sun50i-h6-tqc-a01.dts8
36 files changed, 4117 insertions, 2018 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 3d3e55981ce0..7a4ea1c9ed21 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,5 +1,5 @@
pkgbase = linux-tqc-a01
- pkgver = 5.14.8
+ pkgver = 5.17.7
pkgrel = 1
url = http://www.kernel.org/
arch = aarch64
@@ -14,50 +14,72 @@ pkgbase = linux-tqc-a01
makedepends = vboot-utils
makedepends = dtc
options = !strip
- source = http://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.14.tar.xz
+ source = https://mirror.bjtu.edu.cn/kernel/linux/kernel/v5.x/linux-5.17.tar.xz
source = sun50i-h6-tqc-a01.dts
- source = 0001-mfd-Add-support-for-AC200.patch
- source = 0001-HACK-h6-Add-HDMI-sound-card.patch
source = 0001-make-proc-cpuinfo-consistent-on-arm64-and-arm.patch
- source = 0002-net-phy-Add-support-for-AC200-EPHY.patch
- source = 0002-net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regu.patch
- source = 0003-net-stmmac-sun8i-Rename-PHY-regulator-variable-to-re.patch
- source = 0003-arm64-dts-allwinner-h6-Add-AC200-EPHY-related-nodes.patch
- source = 0004-net-stmmac-sun8i-Add-support-for-enabling-a-regulato.patch
- source = 0005-drm-gem-cma-Export-with-handle-allocator.patch
- source = 0006-drm-sun4i-Add-GEM-allocator.patch
- source = 0010-general-h6-add-dma-i2c-ir-spi-uart.patch
source = 0011-dts-h6-tqc-a01-cpu-opp-2ghz.patch
source = 0012-arm64-h6-gpu-devfreq-enable.patch
- source = 0040-wip-H6-deinterlace.patch
- source = 0041-arm64-dts-h6-deinterlace.patch
+ source = 0012-fix-h6-emmc.patch
+ source = 0013-x-fix-h6-emmc-dts.patch
+ source = arm64-dts-sun50i-h6-Add-AC200-EPHY-related-nodes.patch
+ source = drv-net-phy-Add-support-for-AC200-EPHY.patch
+ source = drv-mfd-Add-support-for-AC200.patch
+ source = net-stmmac-sun8i-Add-support-for-enabling-a-regulator-for-PHY-I.patch
+ source = net-stmmac-sun8i-Rename-PHY-regulator-variable-to-regulator_phy.patch
+ source = net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regulator.patch
+ source = arm64-dts-allwinner-h6-Add-hdmi-sound-card.patch
+ source = 0009-allwinner-h6-support-ac200-audio-codec.patch
+ source = 0010-allwinner-add-sunxi_get_soc_chipid-and-sunxi_get_ser.patch
+ source = arm64-dts-sun50i-h6.dtsi-improve-thermals.patch
+ source = arm64-dts-allwinner-h6-Add-SCPI-protocol.patch
+ source = arm64-dts-allwinner-h6-Protect-SCP-clocks.patch
+ source = drv-pinctrl-sunxi-pinctrl-sun50i-h6.c-GPIO-disable_strict_mode.patch
+ source = WIP-media-uapi-hevc-add-fields-needed-for-rkvdec.patch
+ source = HACK-media-uapi-hevc-tiles-and-num_slices.patch
+ source = Revert-net-Remove-net-ipx.h-and-uapi-linux-ipx.h-hea.patch
+ source = drv-media-cedrus-10-bit-HEVC-support.patch
+ source = drv-media-cedrus-Add-callback-for-buffer-cleanup.patch
+ source = drv-media-cedrus-h264-Improve-buffer-management.patch
+ source = drv-media-cedrus-hevc-Improve-buffer-management.patch
+ source = drv-media-cedrus-hevc-tiles-hack.patch
source = config
source = linux.preset
source = 60-linux.hook
source = 90-linux.hook
- source = https://cdn.kernel.org/pub/linux/kernel/v5.x/patch-5.14.8.xz
- md5sums = a082ef5748b813abca0649dab8be5f52
- md5sums = 46d921dba031a9f397955a787c71911e
- md5sums = 17aa0c69176c68cd98b4522740a1b747
- md5sums = 2285d81ec6fb859d34b7abfd46a59550
+ source = https://mirror.bjtu.edu.cn/kernel/linux/kernel/v5.x/patch-5.17.7.xz
+ md5sums = 07321a70a48d062cebd0358132f11771
+ md5sums = 5dc58208abd2ad11ad2aa67fadf1c66f
md5sums = 7a18066683f3351b2bbd2653db783f80
- md5sums = bc7904920675ba8d38f21d46ffac33b5
- md5sums = 94a69594f90309c50c83a5cc8579fb54
- md5sums = e1868e41094baff9eceba481fc097c79
- md5sums = 2d2de8db5e0c7d8f51a05fd33000c19a
- md5sums = 5d42a68276c8f9e8b3de040fa2579b84
- md5sums = 335382823f6dc2aae2f6038b7aee339e
- md5sums = cb38b30491472097c3b9b475de39127f
- md5sums = bc65c0b9e4d6fb2fe3a81b8358886885
md5sums = 74baf0cb243b3abd5e38f0131c95408f
- md5sums = 05c4d9cbe622d5ff15e6b84b1c5c1a70
- md5sums = d1543c205b4faf9be4552d4308228217
- md5sums = e4ef0ae46cdfb23abb11d729452f68b2
- md5sums = 80fec552244267a059d06399c1a3c931
+ md5sums = 947f64e1c0eec0564cb683940a5af51f
+ md5sums = 6c58c6697e1275038acf579251c69d31
+ md5sums = 2d7918618ec227b65d35078b3c7862ce
+ md5sums = 5cf059c6de6dbee8d20041dcb735f5b1
+ md5sums = f0826f12d7b1f597fba32913e8580543
+ md5sums = 714a3df875f3a05aee07c7c464ad3fe0
+ md5sums = c6bb7c8ce8d41c93d5c2b70f4110135f
+ md5sums = abe164c89da5fb50bb4c866c1d5fe03b
+ md5sums = 72a95b87caccf7f36dff15ed1e4a6df9
+ md5sums = f8aa3197a5c1e6d01cb1809c31cc2d92
+ md5sums = eda5ceb6d7f63318bba5ec63c601ae93
+ md5sums = a709f3089148690f41c739275e66e9b0
+ md5sums = 99368425ced226332796b7f69fda3a2b
+ md5sums = 6ab19f7244b9f82f56edabeb7e1e1004
+ md5sums = a95bab65e3009909138c0982ab7234aa
+ md5sums = 113ec102b9b94a8c8c44dbde7e9b8d59
+ md5sums = 196331c28fc1c77f78d7c6378cfb9e9e
+ md5sums = ec38509f11f44b412f4de990502a3fb7
+ md5sums = 52d4ddae2d47320b97ce311106b407af
+ md5sums = 2eb1edf94864c3c0b2a6f82463f84d67
+ md5sums = 28ce48cd57b8776a75f4fed54569ffd1
+ md5sums = f5e2e35d9f0955cef5cf2332f901ff09
+ md5sums = b36af4f711a0aeb3f0edeb522a9e97bf
+ md5sums = dafb6c0da0e1c6be55c18fc50c850fab
+ md5sums = ce726485a1ab9c726037aa02fdfa15f1
md5sums = 66e0ae63183426b28c0ec0c7e10b5e16
md5sums = ce6c81ad1ad1f8b333fd6077d47abdaf
md5sums = 3dc88030a8f2f5a5f97266d99b149f77
- md5sums = 767e2bd13b4f1497f7500877792cbff2
+ md5sums = c942f79b0f310ca6e8d5828fad539a7f
pkgname = linux-tqc-a01
pkgdesc = The Linux Kernel and modules - AArch64 kernel for TQC A01
@@ -67,7 +89,7 @@ pkgname = linux-tqc-a01
depends = kmod
depends = mkinitcpio>=0.7
optdepends = crda: to set the correct wireless channels of your country
- provides = linux=5.14.8
+ provides = linux=5.17.7
provides = WIREGUARD-MODULE
conflicts = linux
replaces = linux-armv8
@@ -75,5 +97,5 @@ pkgname = linux-tqc-a01
pkgname = linux-tqc-a01-headers
pkgdesc = Header files and scripts for building modules for linux kernel - AArch64 kernel for TQC A01
- provides = linux-headers=5.14.8
+ provides = linux-headers=5.17.7
conflicts = linux-headers
diff --git a/0001-HACK-h6-Add-HDMI-sound-card.patch b/0001-HACK-h6-Add-HDMI-sound-card.patch
deleted file mode 100644
index 71663f441cac..000000000000
--- a/0001-HACK-h6-Add-HDMI-sound-card.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jernej Skrabec <jernej.skrabec@siol.net>
-Date: Sat, 16 Jan 2021 10:58:14 +0100
-Subject: [PATCH] HACK: h6: Add HDMI sound card
-
-Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
----
- arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 20 +++++++++++++++++++-
- 1 file changed, 19 insertions(+), 1 deletion(-)
-
---- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
-+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
-@@ -108,6 +108,24 @@
- (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
- };
-
-+ sound_hdmi: sound {
-+ compatible = "simple-audio-card";
-+ simple-audio-card,format = "i2s";
-+ simple-audio-card,name = "allwinner-hdmi";
-+ simple-audio-card,mclk-fs = <128>;
-+ simple-audio-card,frame-inversion;
-+
-+ simple-audio-card,codec {
-+ sound-dai = <&hdmi>;
-+ };
-+
-+ simple-audio-card,cpu {
-+ sound-dai = <&i2s1>;
-+ dai-tdm-slot-num = <2>;
-+ dai-tdm-slot-width = <32>;
-+ };
-+ };
-+
- soc {
- compatible = "simple-bus";
- #address-cells = <1>;
-@@ -652,7 +670,6 @@
- dmas = <&dma 4>, <&dma 4>;
- resets = <&ccu RST_BUS_I2S1>;
- dma-names = "rx", "tx";
-- status = "disabled";
- };
-
- spdif: spdif@5093000 {
-@@ -785,6 +802,7 @@
- };
-
- hdmi: hdmi@6000000 {
-+ #sound-dai-cells = <0>;
- compatible = "allwinner,sun50i-h6-dw-hdmi";
- reg = <0x06000000 0x10000>;
- reg-io-width = <1>;
diff --git a/0005-drm-gem-cma-Export-with-handle-allocator.patch b/0005-drm-gem-cma-Export-with-handle-allocator.patch
deleted file mode 100644
index b620041bd910..000000000000
--- a/0005-drm-gem-cma-Export-with-handle-allocator.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From ea69ff188dd5d9ac7162f05a22bf299b83a7536e Mon Sep 17 00:00:00 2001
-From: Maxime Ripard <maxime.ripard@free-electrons.com>
-Date: Mon, 7 Dec 2015 09:33:28 +0100
-Subject: [PATCH 005/146] drm: gem: cma: Export with handle allocator
-
-Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
----
- drivers/gpu/drm/drm_gem_cma_helper.c | 3 ++-
- include/drm/drm_gem_cma_helper.h | 4 ++++
- 2 files changed, 6 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c
-index 80a5115c3846..077c61f065d9 100644
---- a/drivers/gpu/drm/drm_gem_cma_helper.c
-+++ b/drivers/gpu/drm/drm_gem_cma_helper.c
-@@ -142,7 +142,7 @@ EXPORT_SYMBOL_GPL(drm_gem_cma_create);
- * A struct drm_gem_cma_object * on success or an ERR_PTR()-encoded negative
- * error code on failure.
- */
--static struct drm_gem_cma_object *
-+struct drm_gem_cma_object *
- drm_gem_cma_create_with_handle(struct drm_file *file_priv,
- struct drm_device *drm, size_t size,
- uint32_t *handle)
-@@ -169,6 +169,7 @@ drm_gem_cma_create_with_handle(struct drm_file *file_priv,
-
- return cma_obj;
- }
-+EXPORT_SYMBOL_GPL(drm_gem_cma_create_with_handle);
-
- /**
- * drm_gem_cma_free_object - free resources associated with a CMA GEM object
-diff --git a/include/drm/drm_gem_cma_helper.h b/include/drm/drm_gem_cma_helper.h
-index 19777145cf8e..79f397c91517 100644
---- a/include/drm/drm_gem_cma_helper.h
-+++ b/include/drm/drm_gem_cma_helper.h
-@@ -79,6 +79,10 @@ int drm_gem_cma_mmap(struct file *filp, struct vm_area_struct *vma);
- /* allocate physical memory */
- struct drm_gem_cma_object *drm_gem_cma_create(struct drm_device *drm,
- size_t size);
-+struct drm_gem_cma_object *
-+drm_gem_cma_create_with_handle(struct drm_file *file_priv,
-+ struct drm_device *drm, size_t size,
-+ uint32_t *handle);
-
- extern const struct vm_operations_struct drm_gem_cma_vm_ops;
-
---
-2.17.1
-
diff --git a/0006-drm-sun4i-Add-GEM-allocator.patch b/0006-drm-sun4i-Add-GEM-allocator.patch
deleted file mode 100644
index 58557aa7768b..000000000000
--- a/0006-drm-sun4i-Add-GEM-allocator.patch
+++ /dev/null
@@ -1,102 +0,0 @@
-From b143de6aef8be007256082e0f89606b7f5e3c757 Mon Sep 17 00:00:00 2001
-From: Maxime Ripard <maxime.ripard@free-electrons.com>
-Date: Mon, 7 Dec 2015 09:47:34 +0100
-Subject: [PATCH 006/146] drm/sun4i: Add GEM allocator
-
-Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
----
- drivers/gpu/drm/sun4i/sun4i_drv.c | 27 +++++++++++++++++++++++++++
- include/uapi/drm/sun4i_drm.h | 29 +++++++++++++++++++++++++++++
- 2 files changed, 56 insertions(+)
- create mode 100644 include/uapi/drm/sun4i_drm.h
-
-diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c
-index 8b0cd08034e0..9f5de14fb2fe 100644
---- a/drivers/gpu/drm/sun4i/sun4i_drv.c
-+++ b/drivers/gpu/drm/sun4i/sun4i_drv.c
-@@ -22,6 +22,8 @@
- #include <drm/drm_fb_helper.h>
- #include <drm/drm_of.h>
-
-+#include <uapi/drm/sun4i_drm.h>
-+
- #include "sun4i_drv.h"
- #include "sun4i_frontend.h"
- #include "sun4i_framebuffer.h"
-@@ -30,6 +32,27 @@
-
- DEFINE_DRM_GEM_CMA_FOPS(sun4i_drv_fops);
-
-+static int sun4i_gem_create_ioctl(struct drm_device *drm, void *data,
-+ struct drm_file *file_priv)
-+{
-+ struct drm_sun4i_gem_create *args = data;
-+ struct drm_gem_cma_object *cma_obj;
-+ size_t size;
-+
-+ /* The Mali requires a 64 bytes alignment */
-+ size = ALIGN(args->size, 64);
-+
-+ cma_obj = drm_gem_cma_create_with_handle(file_priv, drm, size,
-+ &args->handle);
-+
-+ return PTR_ERR_OR_ZERO(cma_obj);
-+}
-+
-+static const struct drm_ioctl_desc sun4i_drv_ioctls[] = {
-+ DRM_IOCTL_DEF_DRV(SUN4I_GEM_CREATE, sun4i_gem_create_ioctl,
-+ DRM_UNLOCKED | DRM_AUTH),
-+};
-+
- static const struct drm_driver sun4i_drv_driver = {
- .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
-
-@@ -42,6 +65,10 @@ static struct drm_driver sun4i_drv_driver = {
- .major = 1,
- .minor = 0,
-
-+ /* Custom ioctls */
-+ .ioctls = sun4i_drv_ioctls,
-+ .num_ioctls = ARRAY_SIZE(sun4i_drv_ioctls),
-+
- /* GEM Operations */
- .dumb_create = drm_gem_cma_dumb_create,
- .gem_free_object_unlocked = drm_gem_cma_free_object,
-diff --git a/include/uapi/drm/sun4i_drm.h b/include/uapi/drm/sun4i_drm.h
-new file mode 100644
-index 000000000000..67b9dd4ee594
---- /dev/null
-+++ b/include/uapi/drm/sun4i_drm.h
-@@ -0,0 +1,29 @@
-+/*
-+ * Copyright (C) 2015 Free Electrons
-+ * Copyright (C) 2015 NextThing Co
-+ *
-+ * Maxime Ripard <maxime.ripard@free-electrons.com>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ */
-+
-+#ifndef _UAPI_SUN4I_DRM_H_
-+#define _UAPI_SUN4I_DRM_H_
-+
-+#include <drm/drm.h>
-+
-+struct drm_sun4i_gem_create {
-+ __u64 size;
-+ __u32 flags;
-+ __u32 handle;
-+};
-+
-+#define DRM_SUN4I_GEM_CREATE 0x00
-+
-+#define DRM_IOCTL_SUN4I_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_SUN4I_GEM_CREATE, \
-+ struct drm_sun4i_gem_create)
-+
-+#endif
---
-2.17.1
-
diff --git a/0009-allwinner-h6-support-ac200-audio-codec.patch b/0009-allwinner-h6-support-ac200-audio-codec.patch
new file mode 100644
index 000000000000..7f4c6273e756
--- /dev/null
+++ b/0009-allwinner-h6-support-ac200-audio-codec.patch
@@ -0,0 +1,1878 @@
+From 818b55daa8e217a54a8baf61943ca3b302371f78 Mon Sep 17 00:00:00 2001
+From: afaulkner420 <afaulkner420@gmail.com>
+Date: Fri, 25 Mar 2022 20:33:02 +0000
+Subject: [PATCH 09/11] allwinner: h6: Support ac200 audio codec
+
+---
+ drivers/mfd/Makefile | 2 +-
+ drivers/mfd/{ac200.c => sunxi-ac200.c} | 16 +-
+ include/linux/mfd/ac200.h | 2 +
+ sound/soc/codecs/Kconfig | 8 +
+ sound/soc/codecs/Makefile | 2 +
+ sound/soc/codecs/acx00.c | 1371 ++++++++++++++++++++++++
+ sound/soc/codecs/acx00.h | 356 ++++++
+ 7 files changed, 1755 insertions(+), 2 deletions(-)
+ rename drivers/mfd/{ac200.c => sunxi-ac200.c} (93%)
+ mode change 100644 => 100755
+ create mode 100644 sound/soc/codecs/acx00.c
+ create mode 100644 sound/soc/codecs/acx00.h
+
+diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
+index 7edc825f9..669f838ab 100644
+--- a/drivers/mfd/Makefile
++++ b/drivers/mfd/Makefile
+@@ -142,7 +142,7 @@ obj-$(CONFIG_MFD_DA9052_SPI) += da9052-spi.o
+ obj-$(CONFIG_MFD_DA9052_I2C) += da9052-i2c.o
+
+ obj-$(CONFIG_MFD_AC100) += ac100.o
+-obj-$(CONFIG_MFD_AC200) += ac200.o
++obj-$(CONFIG_MFD_AC200) += sunxi-ac200.o
+ obj-$(CONFIG_MFD_AXP20X) += axp20x.o
+ obj-$(CONFIG_MFD_AXP20X_I2C) += axp20x-i2c.o
+ obj-$(CONFIG_MFD_AXP20X_RSB) += axp20x-rsb.o
+diff --git a/drivers/mfd/ac200.c b/drivers/mfd/sunxi-ac200.c
+old mode 100644
+new mode 100644
+similarity index 93%
+rename from drivers/mfd/ac200.c
+rename to drivers/mfd/sunxi-ac200.c
+index 570573790..368a54587
+--- a/drivers/mfd/ac200.c
++++ b/drivers/mfd/sunxi-ac200.c
+@@ -41,6 +41,7 @@ static const struct regmap_range_cfg ac200_range_cfg[] = {
+ };
+
+ static const struct regmap_config ac200_regmap_config = {
++ .name = "ac200",
+ .reg_bits = 8,
+ .val_bits = 16,
+ .ranges = ac200_range_cfg,
+@@ -75,6 +76,10 @@ static const struct mfd_cell ac200_cells[] = {
+ .resources = ephy_resource,
+ .of_compatible = "x-powers,ac200-ephy",
+ },
++ {
++ .name = "acx00-codec",
++ .of_compatible = "x-powers,ac200-codec",
++ },
+ };
+
+ static int ac200_i2c_probe(struct i2c_client *i2c,
+@@ -97,8 +102,17 @@ static int ac200_i2c_probe(struct i2c_client *i2c,
+ return ret;
+ }
+
+- /* do a reset to put chip in a known state */
++ ac200->clk = devm_clk_get(dev, NULL);
++ if (IS_ERR(ac200->clk)) {
++ dev_err(dev, "Can't obtain the clock!\n");
++ return PTR_ERR(ac200->clk);
++ }
+
++ ret = clk_prepare_enable(ac200->clk);
++ if (ret)
++ return ret;
++
++ /* do a reset to put chip in a known state */
+ ret = regmap_write(ac200->regmap, AC200_SYS_CONTROL, 0);
+ if (ret)
+ return ret;
+diff --git a/include/linux/mfd/ac200.h b/include/linux/mfd/ac200.h
+index 0c677094a..c8c140226 100644
+--- a/include/linux/mfd/ac200.h
++++ b/include/linux/mfd/ac200.h
+@@ -9,6 +9,7 @@
+ #define __LINUX_MFD_AC200_H
+
+ #include <linux/regmap.h>
++#include <linux/clk.h>
+
+ /* interface registers (can be accessed from any page) */
+ #define AC200_TWI_CHANGE_TO_RSB 0x3E
+@@ -201,6 +202,7 @@
+ #define AC200_IC_CHARA1 0xA1F2
+
+ struct ac200_dev {
++ struct clk *clk;
+ struct regmap *regmap;
+ struct regmap_irq_chip_data *regmap_irqc;
+ };
+diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
+index 6fd8bc760..d98d9b300 100644
+--- a/sound/soc/codecs/Kconfig
++++ b/sound/soc/codecs/Kconfig
+@@ -1943,4 +1943,12 @@ config SND_SOC_LPASS_TX_MACRO
+ select REGMAP_MMIO
+ tristate "Qualcomm TX Macro in LPASS(Low Power Audio SubSystem)"
+
++config SND_SOC_ACX00
++ tristate "ACX00 Codec"
++ select MFD_ACX00
++ default n
++ help
++ ACX00 now used as SUN50IW6 internal Codec, Connect Through I2S0.
++ Say Y or M if you want to add support internal audio codec.
++
+ endmenu
+diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
+index bb3607f33..04ea67b1a 100644
+--- a/sound/soc/codecs/Makefile
++++ b/sound/soc/codecs/Makefile
+@@ -318,6 +318,7 @@ snd-soc-wm9713-objs := wm9713.o
+ snd-soc-wm-hubs-objs := wm_hubs.o
+ snd-soc-wsa881x-objs := wsa881x.o
+ snd-soc-zl38060-objs := zl38060.o
++snd-soc-acx00-objs := acx00.o
+ # Amp
+ snd-soc-max9877-objs := max9877.o
+ snd-soc-max98504-objs := max98504.o
+@@ -650,6 +651,7 @@ obj-$(CONFIG_SND_SOC_WM_ADSP) += snd-soc-wm-adsp.o
+ obj-$(CONFIG_SND_SOC_WM_HUBS) += snd-soc-wm-hubs.o
+ obj-$(CONFIG_SND_SOC_WSA881X) += snd-soc-wsa881x.o
+ obj-$(CONFIG_SND_SOC_ZL38060) += snd-soc-zl38060.o
++obj-$(CONFIG_SND_SOC_ACX00) += snd-soc-acx00.o
+
+ # Amp
+ obj-$(CONFIG_SND_SOC_MAX9877) += snd-soc-max9877.o
+diff --git a/sound/soc/codecs/acx00.c b/sound/soc/codecs/acx00.c
+new file mode 100644
+index 000000000..ab7467e4e
+--- /dev/null
++++ b/sound/soc/codecs/acx00.c
+@@ -0,0 +1,1371 @@
++/*
++ * acx00.c -- ACX00 ALSA Soc Audio Codec driver
++ *
++ * (C) Copyright 2010-2016 Allwinnertech Technology., Ltd.
++ *
++ * Author: Wolfgang Huang <huangjinhui@allwinner.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/firmware.h>
++#include <linux/delay.h>
++#include <linux/pm.h>
++#include <linux/i2c.h>
++#include <linux/clk.h>
++#include <linux/of_gpio.h>
++#include <linux/of_device.h>
++#include <linux/of_platform.h>
++#include <linux/debugfs.h>
++#include <linux/slab.h>
++#include <linux/mfd/ac200.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/soc.h>
++#include <sound/initval.h>
++#include <sound/tlv.h>
++#include <linux/workqueue.h>
++
++#include "acx00.h"
++
++
++#define ACX00_DEF_VOL 0x9F9F
++#undef ACX00_DAPM_LINEOUT
++
++struct acx00_priv {
++ struct ac200_dev *acx00; /* parent mfd device struct */
++ struct snd_soc_component *component;
++ struct clk *clk;
++ unsigned int sample_rate;
++ unsigned int fmt;
++ unsigned int enable;
++ unsigned int spk_gpio;
++ unsigned int switch_gpio;
++ bool spk_gpio_used;
++ struct mutex mutex;
++ struct delayed_work spk_work;
++ struct delayed_work resume_work;
++};
++
++struct sample_rate {
++ unsigned int samplerate;
++ unsigned int rate_bit;
++};
++
++static const struct sample_rate sample_rate_conv[] = {
++ {44100, 7},
++ {48000, 8},
++ {8000, 0},
++ {32000, 6},
++ {22050, 4},
++ {24000, 5},
++ {16000, 3},
++ {11025, 1},
++ {12000, 2},
++ {192000, 10},
++ {96000, 9},
++};
++
++void __iomem *io_stat_addr;
++
++static const DECLARE_TLV_DB_SCALE(i2s_mixer_adc_tlv, -600, 600, 1);
++static const DECLARE_TLV_DB_SCALE(i2s_mixer_dac_tlv, -600, 600, 1);
++static const DECLARE_TLV_DB_SCALE(dac_mixer_adc_tlv, -600, 600, 1);
++static const DECLARE_TLV_DB_SCALE(dac_mixer_dac_tlv, -600, 600, 1);
++static const DECLARE_TLV_DB_SCALE(line_out_tlv, -450, 150, 0);
++static const DECLARE_TLV_DB_SCALE(mic_out_tlv, -450, 150, 0);
++static const DECLARE_TLV_DB_SCALE(phoneout_tlv, -450, 150, 0);
++static const DECLARE_TLV_DB_SCALE(adc_input_tlv, -450, 150, 0);
++static const DECLARE_TLV_DB_SCALE(lineout_tlv, -4800, 150, 1);
++static const unsigned int mic_boost_tlv[] = {
++ TLV_DB_RANGE_HEAD(2),
++ 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
++ 1, 7, TLV_DB_SCALE_ITEM(2400, 300, 0),
++};
++
++static const struct snd_kcontrol_new acx00_codec_controls[] = {
++ SOC_DOUBLE_TLV("I2S Mixer ADC Volume", AC_I2S_MIXER_GAIN,
++ I2S_MIXERL_GAIN_ADC, I2S_MIXERR_GAIN_ADC,
++ 0x1, 0, i2s_mixer_adc_tlv),
++ SOC_DOUBLE_TLV("I2S Mixer DAC Volume", AC_I2S_MIXER_GAIN,
++ I2S_MIXERL_GAIN_DAC, I2S_MIXERR_GAIN_DAC,
++ 0x1, 0, i2s_mixer_dac_tlv),
++ SOC_DOUBLE_TLV("DAC Mixer ADC Volume", AC_DAC_MIXER_GAIN,
++ DAC_MIXERL_GAIN_ADC, DAC_MIXERR_GAIN_ADC,
++ 0x1, 0, dac_mixer_adc_tlv),
++ SOC_DOUBLE_TLV("DAC Mxier DAC Volume", AC_DAC_MIXER_GAIN,
++ DAC_MIXERL_GAIN_DAC, DAC_MIXERR_GAIN_DAC,
++ 0x1, 0, dac_mixer_dac_tlv),
++ SOC_SINGLE_TLV("Line Out Mixer Volume", AC_OUT_MIXER_CTL,
++ OUT_MIXER_LINE_VOL, 0x7, 0, line_out_tlv),
++ SOC_DOUBLE_TLV("MIC Out Mixer Volume", AC_OUT_MIXER_CTL,
++ OUT_MIXER_MIC1_VOL, OUT_MIXER_MIC2_VOL,
++ 0x7, 0, mic_out_tlv),
++ SOC_SINGLE_TLV("ADC Input Volume", AC_ADC_MIC_CTL,
++ ADC_GAIN, 0x07, 0, adc_input_tlv),
++ SOC_SINGLE_TLV("Master Volume", AC_LINEOUT_CTL,
++ LINEOUT_VOL, 0x1f, 0, lineout_tlv),
++ SOC_SINGLE_TLV("MIC1 Boost Volume", AC_ADC_MIC_CTL,
++ MIC1_BOOST, 0x07, 0, mic_boost_tlv),
++ SOC_SINGLE_TLV("MIC2 Boost Volume", AC_ADC_MIC_CTL,
++ MIC2_BOOST, 0x07, 0, mic_boost_tlv),
++};
++
++/* Enable I2S & DAC clk, then enable the DAC digital part */
++static int acx00_playback_event(struct snd_soc_dapm_widget *w,
++ struct snd_kcontrol *k, int event)
++{
++ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
++
++ switch (event) {
++ case SND_SOC_DAPM_POST_PMU:
++ snd_soc_component_update_bits(component, AC_SYS_CLK_CTL,
++ (0x1<<SYS_CLK_DAC), (0x1<<SYS_CLK_DAC));
++ snd_soc_component_update_bits(component, AC_SYS_MOD_RST,
++ (0x1<<MOD_RST_DAC), (0x1<<MOD_RST_DAC));
++ snd_soc_component_update_bits(component, AC_DAC_CTL,
++ (0x1<<DAC_CTL_DAC_EN), (0x1<<DAC_CTL_DAC_EN));
++ break;
++ case SND_SOC_DAPM_POST_PMD:
++ snd_soc_component_update_bits(component, AC_SYS_CLK_CTL,
++ (0x1<<SYS_CLK_DAC), (0x0<<SYS_CLK_DAC));
++ snd_soc_component_update_bits(component, AC_SYS_MOD_RST,
++ (0x1<<MOD_RST_DAC), (0x0<<MOD_RST_DAC));
++ snd_soc_component_update_bits(component, AC_DAC_CTL,
++ (0x1<<DAC_CTL_DAC_EN), (0x0<<DAC_CTL_DAC_EN));
++ break;
++ default:
++ break;
++ }
++ return 0;
++}
++
++/* Enable I2S & ADC clk, then enable the ADC digital part */
++static int acx00_capture_event(struct snd_soc_dapm_widget *w,
++ struct snd_kcontrol *k, int event)
++{
++ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
++
++ switch (event) {
++ case SND_SOC_DAPM_POST_PMU:
++ snd_soc_component_update_bits(component, AC_SYS_CLK_CTL,
++ (0x1<<SYS_CLK_ADC), (0x1<<SYS_CLK_ADC));
++ snd_soc_component_update_bits(component, AC_SYS_MOD_RST,
++ (0x1<<MOD_RST_ADC), (0x1<<MOD_RST_ADC));
++ snd_soc_component_update_bits(component, AC_ADC_CTL,
++ (0x1<<ADC_EN), (0x1<<ADC_EN));
++ break;
++ case SND_SOC_DAPM_POST_PMD:
++ snd_soc_component_update_bits(component, AC_SYS_CLK_CTL,
++ (0x1<<SYS_CLK_ADC), (0x0<<SYS_CLK_ADC));
++ snd_soc_component_update_bits(component, AC_SYS_MOD_RST,
++ (0x1<<MOD_RST_ADC), (0x0<<MOD_RST_ADC));
++ snd_soc_component_update_bits(component, AC_ADC_CTL,
++ (0x1<<ADC_EN), (0x0<<ADC_EN));
++ break;
++ default:
++ break;
++ }
++ return 0;
++}
++
++/*
++ * we used for three scene:
++ * 1. No external Spker & DAPM LINEOUT used, we just enable the LINEOUT in the
++ * ALSA codec probe(acx00_codec_probe) and resume, and we shutdown the LINEOUT
++ * in device shutdown or suspend.
++ * 2. No external Spker, but DAPM LINEOUT used, we just using the LINEOUT
++ * enable or disable throught the DAPM control.
++ * 3. External Spker & DAPM LINEOUT used, we just using the LINEOUT and
++ * External Spker control GPIO enable or disable through DAPM control.
++ */
++static unsigned int spk_delay = 100;
++module_param(spk_delay, int, 0644);
++MODULE_PARM_DESC(spk_delay, "ACX00-Codec spk mute delay time");
++
++static void acx00_spk_enable(struct work_struct *work)
++{
++ struct acx00_priv *priv = container_of(work,
++ struct acx00_priv, spk_work.work);
++ gpio_set_value(priv->spk_gpio, 1);
++}
++
++static int acx00_lineout_event(struct snd_soc_dapm_widget *w,
++ struct snd_kcontrol *k, int event)
++{
++ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
++ struct acx00_priv *priv = snd_soc_component_get_drvdata(component);
++
++ switch (event) {
++ case SND_SOC_DAPM_POST_PMU:
++ if (!priv->enable) {
++ snd_soc_component_update_bits(priv->component, AC_LINEOUT_CTL,
++ (1<<LINEL_SRC_EN), (1<<LINEL_SRC_EN));
++ snd_soc_component_update_bits(priv->component, AC_LINEOUT_CTL,
++ (1<<LINER_SRC_EN), (1<<LINER_SRC_EN));
++ msleep(100);
++ priv->enable = 1;
++ }
++#ifdef ACX00_DAPM_LINEOUT
++ snd_soc_component_update_bits(component, AC_LINEOUT_CTL,
++ (1<<LINEOUT_EN), (1<<LINEOUT_EN));
++ mdelay(50);
++#endif
++ if (priv->spk_gpio_used) {
++ if (spk_delay == 0) {
++ gpio_set_value(priv->spk_gpio, 1);
++ /*
++ * time delay to wait spk pa work fine,
++ * general setting 50ms
++ */
++ mdelay(50);
++ } else
++ schedule_delayed_work(&priv->spk_work,
++ msecs_to_jiffies(spk_delay));
++ }
++ break;
++ case SND_SOC_DAPM_PRE_PMD:
++ mdelay(50);
++ if (priv->spk_gpio_used) {
++ gpio_set_value(priv->spk_gpio, 0);
++ msleep(50);
++ }
++#ifdef ACX00_DAPM_LINEOUT
++ snd_soc_component_update_bits(component, AC_LINEOUT_CTL,
++ (1<<LINEOUT_EN), (0<<LINEOUT_EN));
++#endif
++ break;
++ default:
++ break;
++ }
++ return 0;
++}
++
++/* AC_I2S_MIXER_SRC : 0x2114 */
++static const struct snd_kcontrol_new i2sl_mixer_src[] = {
++ SOC_DAPM_SINGLE("I2SDACL Switch", AC_I2S_MIXER_SRC,
++ I2S_MIXERL_SRC_DAC, 1, 0),
++ SOC_DAPM_SINGLE("ADCL Switch", AC_I2S_MIXER_SRC,
++ I2S_MIXERL_SRC_ADC, 1, 0),
++};
++
++static const struct snd_kcontrol_new i2sr_mixer_src[] = {
++ SOC_DAPM_SINGLE("I2SDACR Switch", AC_I2S_MIXER_SRC,
++ I2S_MIXERR_SRC_DAC, 1, 0),
++ SOC_DAPM_SINGLE("ADCR Switch", AC_I2S_MIXER_SRC,
++ I2S_MIXERR_SRC_ADC, 1, 0),
++};
++
++/* AC_DAC_MIXER_SRC : 0x2202 */
++static const struct snd_kcontrol_new dacl_mixer_src[] = {
++ SOC_DAPM_SINGLE("I2SDACL Switch", AC_DAC_MIXER_SRC,
++ DAC_MIXERL_SRC_DAC, 1, 0),
++ SOC_DAPM_SINGLE("ADCL Switch", AC_DAC_MIXER_SRC,
++ DAC_MIXERL_SRC_ADC, 1, 0),
++};
++
++static const struct snd_kcontrol_new dacr_mixer_src[] = {
++ SOC_DAPM_SINGLE("I2SDACR Switch", AC_DAC_MIXER_SRC,
++ DAC_MIXERR_SRC_DAC, 1, 0),
++ SOC_DAPM_SINGLE("ADCR Switch", AC_DAC_MIXER_SRC,
++ DAC_MIXERR_SRC_ADC, 1, 0),
++};
++
++/* AC_OUT_MIXER_SRC : 0x2222 */
++static const struct snd_kcontrol_new left_output_mixer[] = {
++ SOC_DAPM_SINGLE("MIC1 Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERL_SRC_MIC1, 1, 0),
++ SOC_DAPM_SINGLE("MIC2 Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERL_SRC_MIC2, 1, 0),
++ SOC_DAPM_SINGLE("PhonePN Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERL_SRC_PHPN, 1, 0),
++ SOC_DAPM_SINGLE("PhoneN Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERL_SRC_PHN, 1, 0),
++ SOC_DAPM_SINGLE("LINEINL Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERL_SRC_LINEL, 1, 0),
++ SOC_DAPM_SINGLE("DACL Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERL_SRC_DACL, 1, 0),
++ SOC_DAPM_SINGLE("DACR Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERL_SRC_DACR, 1, 0),
++};
++
++static const struct snd_kcontrol_new right_output_mixer[] = {
++ SOC_DAPM_SINGLE("MIC1 Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERR_SRC_MIC1, 1, 0),
++ SOC_DAPM_SINGLE("MIC2 Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERR_SRC_MIC2, 1, 0),
++ SOC_DAPM_SINGLE("PhonePN Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERR_SRC_PHPN, 1, 0),
++ SOC_DAPM_SINGLE("PhoneP Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERR_SRC_PHP, 1, 0),
++ SOC_DAPM_SINGLE("LINEINR Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERR_SRC_LINER, 1, 0),
++ SOC_DAPM_SINGLE("DACR Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERR_SRC_DACR, 1, 0),
++ SOC_DAPM_SINGLE("DACL Switch", AC_OUT_MIXER_SRC,
++ OUT_MIXERR_SRC_DACL, 1, 0),
++};
++
++/* AC_LINEOUT_CTL : 0x2224 */
++const char * const left_lineout_text[] = {
++ "Left OMixer", "LR OMixer",
++};
++
++static const struct soc_enum left_lineout_enum =
++ SOC_ENUM_SINGLE(AC_LINEOUT_CTL, LINEL_SRC,
++ ARRAY_SIZE(left_lineout_text), left_lineout_text);
++
++static const struct snd_kcontrol_new left_lineout_mux =
++ SOC_DAPM_ENUM("Left LINEOUT Mux", left_lineout_enum);
++
++const char * const right_lineout_text[] = {
++ "Right OMixer", "LR OMixer",
++};
++
++static const struct soc_enum right_lineout_enum =
++ SOC_ENUM_SINGLE(AC_LINEOUT_CTL, LINER_SRC,
++ ARRAY_SIZE(right_lineout_text), right_lineout_text);
++
++static const struct snd_kcontrol_new right_lineout_mux =
++ SOC_DAPM_ENUM("Right LINEOUT Mux", right_lineout_enum);
++
++/* AC_ADC_MIXER_SRC : 0x2322 */
++static const struct snd_kcontrol_new left_input_mixer[] = {
++ SOC_DAPM_SINGLE("MIC1 Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERL_MIC1, 1, 0),
++ SOC_DAPM_SINGLE("MIC2 Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERL_MIC2, 1, 0),
++ SOC_DAPM_SINGLE("PhonePN Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERL_PHPN, 1, 0),
++ SOC_DAPM_SINGLE("PhoneN Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERL_PHN, 1, 0),
++ SOC_DAPM_SINGLE("LINEINL Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERL_LINEL, 1, 0),
++ SOC_DAPM_SINGLE("OMixerL Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERL_MIXL, 1, 0),
++ SOC_DAPM_SINGLE("OMixerR Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERL_MIXR, 1, 0),
++};
++
++static const struct snd_kcontrol_new right_input_mixer[] = {
++ SOC_DAPM_SINGLE("MIC1 Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERR_MIC1, 1, 0),
++ SOC_DAPM_SINGLE("MIC2 Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERR_MIC2, 1, 0),
++ SOC_DAPM_SINGLE("PhonePN Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERR_PHPN, 1, 0),
++ SOC_DAPM_SINGLE("PhoneP Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERR_PHP, 1, 0),
++ SOC_DAPM_SINGLE("LINEINR Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERR_LINER, 1, 0),
++ SOC_DAPM_SINGLE("OMixerR Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERR_MIXR, 1, 0),
++ SOC_DAPM_SINGLE("OMixerL Switch", AC_ADC_MIXER_SRC,
++ ADC_MIXERR_MIXL, 1, 0),
++};
++
++static const struct snd_soc_dapm_widget acx00_codec_dapm_widgets[] = {
++ SND_SOC_DAPM_AIF_IN_E("DACL", "Playback", 0, AC_DAC_CTL,
++ OUT_MIXER_DACL_EN, 0,
++ acx00_playback_event,
++ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
++ SND_SOC_DAPM_AIF_IN_E("DACR", "Playback", 0,
++ AC_DAC_CTL, OUT_MIXER_DACR_EN, 0,
++ acx00_playback_event,
++ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
++
++ SND_SOC_DAPM_AIF_OUT_E("ADCL", "Capture", 0,
++ AC_ADC_MIC_CTL, ADCL_EN, 0,
++ acx00_capture_event,
++ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
++ SND_SOC_DAPM_AIF_OUT_E("ADCR", "Capture", 0,
++ AC_ADC_MIC_CTL, ADCR_EN, 0,
++ acx00_capture_event,
++ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
++
++ SND_SOC_DAPM_MIXER("Left Output Mixer", AC_OUT_MIXER_CTL,
++ OUT_MIXER_LMIX_EN, 0,
++ left_output_mixer, ARRAY_SIZE(left_output_mixer)),
++
++ SND_SOC_DAPM_MIXER("Right Output Mixer", AC_OUT_MIXER_CTL,
++ OUT_MIXER_RMIX_EN, 0, right_output_mixer,
++ ARRAY_SIZE(right_output_mixer)),
++
++ SND_SOC_DAPM_MIXER("Left Input Mixer", SND_SOC_NOPM, 0, 0,
++ left_input_mixer, ARRAY_SIZE(left_input_mixer)),
++ SND_SOC_DAPM_MIXER("Right Input Mixer", SND_SOC_NOPM, 0, 0,
++ right_input_mixer, ARRAY_SIZE(right_input_mixer)),
++
++ SND_SOC_DAPM_MIXER("Left DAC Mixer", AC_OUT_MIXER_CTL,
++ OUT_MIXER_DACL_EN, 0, dacl_mixer_src,
++ ARRAY_SIZE(dacl_mixer_src)),
++ SND_SOC_DAPM_MIXER("Right DAC Mixer", AC_OUT_MIXER_CTL,
++ OUT_MIXER_DACR_EN, 0, dacr_mixer_src,
++ ARRAY_SIZE(dacr_mixer_src)),
++
++ SND_SOC_DAPM_MIXER("Left I2S Mixer", SND_SOC_NOPM,
++ 0, 0, i2sl_mixer_src, ARRAY_SIZE(i2sl_mixer_src)),
++ SND_SOC_DAPM_MIXER("Right I2S Mixer", SND_SOC_NOPM,
++ 0, 0, i2sr_mixer_src, ARRAY_SIZE(i2sr_mixer_src)),
++
++ SND_SOC_DAPM_MUX("Left LINEOUT Mux", SND_SOC_NOPM,
++ 0, 0, &left_lineout_mux),
++ SND_SOC_DAPM_MUX("Right LINEOUT Mux", SND_SOC_NOPM,
++ 0, 0, &right_lineout_mux),
++
++ SND_SOC_DAPM_PGA("MIC1 PGA", AC_ADC_MIC_CTL,
++ MIC1_GAIN_EN, 0, NULL, 0),
++ SND_SOC_DAPM_PGA("MIC2 PGA", AC_ADC_MIC_CTL,
++ MIC2_GAIN_EN, 0, NULL, 0),
++
++ SND_SOC_DAPM_MICBIAS("MIC Bias", AC_MICBIAS_CTL,
++ MMBIAS_EN, 0),
++
++ /* PHONEIN & PHONEOUT not enable in pin assign */
++ SND_SOC_DAPM_INPUT("PHONEINP"),
++ SND_SOC_DAPM_INPUT("PHONEINN"),
++ SND_SOC_DAPM_INPUT("PHONEINPN"),
++
++ /* endpoint define */
++ SND_SOC_DAPM_LINE("LINEIN", NULL),
++ SND_SOC_DAPM_LINE("LINEOUT", acx00_lineout_event),
++ SND_SOC_DAPM_MIC("MIC1", NULL),
++ SND_SOC_DAPM_MIC("MIC2", NULL),
++};
++
++static const struct snd_soc_dapm_route acx00_codec_dapm_routes[] = {
++ {"Left Output Mixer", "MIC1 Switch", "MIC1 PGA"},
++ {"Left Output Mixer", "MIC2 Switch", "MIC2 PGA"},
++ {"Left Output Mixer", "PhonePN Switch", "PHONEINPN"},
++ {"Left Output Mixer", "PhoneN Switch", "PHONEINN"},
++ {"Left Output Mixer", "LINEINL Switch", "LINEIN"},
++ {"Left Output Mixer", "DACR Switch", "Right DAC Mixer"},
++ {"Left Output Mixer", "DACL Switch", "Left DAC Mixer"},
++
++ {"Right Output Mixer", "MIC1 Switch", "MIC1 PGA"},
++ {"Right Output Mixer", "MIC2 Switch", "MIC2 PGA"},
++ {"Right Output Mixer", "PhonePN Switch", "PHONEINPN"},
++ {"Right Output Mixer", "PhoneP Switch", "PHONEINP"},
++ {"Right Output Mixer", "LINEINR Switch", "LINEIN"},
++ {"Right Output Mixer", "DACR Switch", "Right DAC Mixer"},
++ {"Right Output Mixer", "DACL Switch", "Left DAC Mixer"},
++
++ {"Left LINEOUT Mux", NULL, "Left Output Mixer"},
++ {"Left LINEOUT Mux", "LR OMixer", "Right Output Mixer"},
++ {"Right LINEOUT Mux", NULL, "Right Output Mixer"},
++ {"Right LINEOUT Mux", "LR OMixer", "Left Output Mixer"},
++
++ {"Left Input Mixer", "MIC1 Switch", "MIC1 PGA"},
++ {"Left Input Mixer", "MIC2 Switch", "MIC2 PGA"},
++ {"Left Input Mixer", "PhonePN Switch", "PHONEINPN"},
++ {"Left Input Mixer", "PhoneN Switch", "PHONEINN"},
++ {"Left Input Mixer", "LINEINL Switch", "LINEIN"},
++ {"Left Input Mixer", "OMixerL Switch", "Left Output Mixer"},
++ {"Left Input Mixer", "OMixerR Switch", "Right Output Mixer"},
++
++ {"Right Input Mixer", "MIC1 Switch", "MIC1 PGA"},
++ {"Right Input Mixer", "MIC2 Switch", "MIC2 PGA"},
++ {"Right Input Mixer", "PhonePN Switch", "PHONEINPN"},
++ {"Right Input Mixer", "PhoneP Switch", "PHONEINP"},
++ {"Right Input Mixer", "LINEINR Switch", "LINEIN"},
++ {"Right Input Mixer", "OMixerR Switch", "Right Output Mixer"},
++ {"Right Input Mixer", "OMixerL Switch", "Left Output Mixer"},
++
++ {"Left I2S Mixer", "I2SDACL Switch", "DACL"},
++ {"Left I2S Mixer", "ADCL Switch", "Left Input Mixer"},
++
++ {"Right I2S Mixer", "I2SDACR Switch", "DACR"},
++ {"Right I2S Mixer", "ADCR Switch", "Right Input Mixer"},
++
++ {"Left DAC Mixer", "I2SDACL Switch", "DACL"},
++ {"Left DAC Mixer", "ADCL Switch", "Left Input Mixer"},
++
++ {"Right DAC Mixer", "I2SDACR Switch", "DACR"},
++ {"Right DAC Mixer", "ADCR Switch", "Right Input Mixer"},
++
++ {"ADCL", NULL, "Left I2S Mixer"},
++ {"ADCR", NULL, "Right I2S Mixer"},
++
++ {"LINEOUT", NULL, "Left LINEOUT Mux"},
++ {"LINEOUT", NULL, "Right LINEOUT Mux"},
++
++ {"MIC Bias", NULL, "MIC1"},
++ {"MIC Bias", NULL, "MIC2"},
++ {"MIC1 PGA", NULL, "MIC Bias"},
++ {"MIC2 PGA", NULL, "MIC Bias"},
++};
++
++static void acx00_codec_txctrl_enable(struct snd_soc_component *component,
++ int enable)
++{
++ pr_debug("Enter %s, enable %d\n", __func__, enable);
++ if (enable) {
++ snd_soc_component_update_bits(component, AC_I2S_CTL,
++ (1<<I2S_RX_EN), (1<<I2S_RX_EN));
++ } else {
++ snd_soc_component_update_bits(component, AC_I2S_CTL,
++ (1<<I2S_RX_EN), (0<<I2S_RX_EN));
++ }
++ pr_debug("End %s, enable %d\n", __func__, enable);
++}
++
++static void acx00_codec_rxctrl_enable(struct snd_soc_component *component,
++ int enable)
++{
++ pr_debug("Enter %s, enable %d\n", __func__, enable);
++ if (enable) {
++ snd_soc_component_update_bits(component, AC_I2S_CTL,
++ (1<<I2S_TX_EN), (1<<I2S_TX_EN));
++ } else {
++ snd_soc_component_update_bits(component, AC_I2S_CTL,
++ (1<<I2S_TX_EN), (0<<I2S_TX_EN));
++ }
++ pr_debug("End %s, enable %d\n", __func__, enable);
++}
++
++int acx00_reg_read(struct ac200_dev *acx00, unsigned short reg)
++{
++ unsigned int val;
++ int ret;
++
++ ret = regmap_read(acx00->regmap, reg, &val);
++
++ if (ret < 0)
++ return ret;
++ else
++ return val;
++}
++
++int acx00_reg_write(struct ac200_dev *acx00, unsigned short reg, unsigned short val)
++{
++ return regmap_write(acx00->regmap, reg, val);
++}
++
++static void acx00_codec_init(struct snd_soc_component *component)
++{
++ struct acx00_priv *priv = snd_soc_component_get_drvdata(component);
++
++ acx00_reg_write(priv->acx00, 0x50, 0x82b1);
++ acx00_reg_write(priv->acx00, 0xc, 0xce01);
++
++ /* acx00_codec sysctl init */
++ acx00_reg_write(priv->acx00, 0x0010, 0x03);
++ acx00_reg_write(priv->acx00, 0x0012, 0x01);
++
++ /* The bit3 need to setup to 1 for bias current. */
++ snd_soc_component_update_bits(component, AC_MICBIAS_CTL,
++ (0x1 << ADDA_BIAS_CUR), (0x1 << ADDA_BIAS_CUR));
++
++ /* enable the output & global enable bit */
++ snd_soc_component_update_bits(component, AC_I2S_CTL,
++ (1<<I2S_SDO0_EN), (1<<I2S_SDO0_EN));
++ snd_soc_component_update_bits(component, AC_I2S_CTL, (1<<I2S_GEN), (1<<I2S_GEN));
++
++ /* Default setting slot width as 32 bit for I2S */
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (7<<I2S_FMT_SLOT_WIDTH), (7<<I2S_FMT_SLOT_WIDTH));
++
++ /* default setting 0xA0A0 for ADC & DAC Volume */
++ snd_soc_component_write(component, AC_I2S_DAC_VOL, ACX00_DEF_VOL);
++ snd_soc_component_write(component, AC_I2S_ADC_VOL, ACX00_DEF_VOL);
++
++ /* Enable HPF for high pass filter */
++ snd_soc_component_update_bits(component, AC_DAC_CTL,
++ (1<<DAC_CTL_HPF_EN), (1<<DAC_CTL_HPF_EN));
++
++ /* LINEOUT ANTI POP & Click noise */
++ snd_soc_component_update_bits(component, AC_LINEOUT_CTL,
++ (0x7<<LINE_ANTI_TIME), (0x3<<LINE_ANTI_TIME));
++ snd_soc_component_update_bits(component, AC_LINEOUT_CTL,
++ (0x3<<LINE_SLOPE_SEL), (0x3<<LINE_SLOPE_SEL));
++
++ /* enable & setting adc convert delay time */
++ snd_soc_component_update_bits(component, AC_ADC_CTL, (0x3<<ADC_DELAY_TIME),
++ (0x3<<ADC_DELAY_TIME));
++ snd_soc_component_update_bits(component, AC_ADC_CTL, (1<<ADC_DELAY_EN),
++ (1<<ADC_DELAY_EN));
++
++ if (priv->spk_gpio_used) {
++ snd_soc_component_update_bits(priv->component, AC_LINEOUT_CTL,
++ (1<<LINEL_SRC_EN), (1<<LINEL_SRC_EN));
++ snd_soc_component_update_bits(priv->component, AC_LINEOUT_CTL,
++ (1<<LINER_SRC_EN), (1<<LINER_SRC_EN));
++ priv->enable = 1;
++ }
++#ifndef ACX00_DAPM_LINEOUT
++ snd_soc_component_update_bits(component, AC_LINEOUT_CTL, (1<<LINEOUT_EN),
++ (1<<LINEOUT_EN));
++#endif
++
++ snd_soc_component_update_bits(component, AC_LINEOUT_CTL, 0x1f, 0x0f);
++ snd_soc_component_write(component, AC_DAC_MIXER_SRC, 0x2200);
++ snd_soc_component_write(component, AC_OUT_MIXER_SRC, 0x0202);
++}
++
++static int acx00_codec_hw_params(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
++{
++ struct snd_soc_component *component = dai->component;
++ int i;
++
++ switch (params_format(params)) {
++ case SNDRV_PCM_FORMAT_S16_LE:
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (7<<I2S_FMT_SAMPLE), (3<<I2S_FMT_SAMPLE));
++ break;
++ case SNDRV_PCM_FORMAT_S24_LE:
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (7<<I2S_FMT_SAMPLE), (5<<I2S_FMT_SAMPLE));
++ break;
++ case SNDRV_PCM_FORMAT_S32_LE:
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (7<<I2S_FMT_SAMPLE), (7<<I2S_FMT_SAMPLE));
++ break;
++ default:
++ dev_err(component->dev, "unrecognized format support\n");
++ break;
++ }
++ for (i = 0; i < ARRAY_SIZE(sample_rate_conv); i++) {
++ if (sample_rate_conv[i].samplerate == params_rate(params)) {
++ snd_soc_component_update_bits(component, AC_SYS_SR_CTL,
++ (SYS_SR_MASK<<SYS_SR_BIT),
++ (sample_rate_conv[i].rate_bit<<SYS_SR_BIT));
++ }
++ }
++
++ return 0;
++}
++
++static int acx00_codec_dai_set_sysclk(struct snd_soc_dai *codec_dai,
++ int clk_id, unsigned int freq, int dir)
++{
++ return 0;
++}
++
++static int acx00_codec_dai_set_fmt(struct snd_soc_dai *codec_dai,
++ unsigned int fmt)
++{
++ struct acx00_priv *priv = snd_soc_dai_get_drvdata(codec_dai);
++ struct snd_soc_component *component = priv->component;
++
++ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
++ /* codec clk & FRM master */
++ case SND_SOC_DAIFMT_CBM_CFM:
++ snd_soc_component_update_bits(component, AC_I2S_CLK,
++ (0x1<<I2S_BCLK_OUT), (0x1<<I2S_BCLK_OUT));
++ snd_soc_component_update_bits(component, AC_I2S_CLK,
++ (0x1<<I2S_LRCK_OUT), (0x1<<I2S_LRCK_OUT));
++ break;
++ /* codec clk & FRM slave */
++ case SND_SOC_DAIFMT_CBS_CFS:
++ snd_soc_component_update_bits(component, AC_I2S_CLK,
++ (0x1<<I2S_BCLK_OUT), 0x0<<I2S_BCLK_OUT);
++ snd_soc_component_update_bits(component, AC_I2S_CLK,
++ (0x1<<I2S_LRCK_OUT), 0x0<<I2S_LRCK_OUT);
++ break;
++ }
++
++ switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
++ case SND_SOC_DAIFMT_I2S:
++ snd_soc_component_update_bits(component, AC_I2S_CLK,
++ (0x3FF<<I2S_LRCK_PERIOD),
++ (0x1F<<I2S_LRCK_PERIOD));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x3<<I2S_FMT_MODE), (0x1<<I2S_FMT_MODE));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_TX_OFFSET),
++ (0x1<<I2S_FMT_TX_OFFSET));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_RX_OFFSET),
++ (0x1<<I2S_FMT_RX_OFFSET));
++ break;
++ case SND_SOC_DAIFMT_RIGHT_J:
++ snd_soc_component_update_bits(component, AC_I2S_CLK,
++ (0x3FF<<I2S_LRCK_PERIOD),
++ (0x1F<<I2S_LRCK_PERIOD));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x3<<I2S_FMT_MODE), (0x2<<I2S_FMT_MODE));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_TX_OFFSET),
++ (0x0<<I2S_FMT_TX_OFFSET));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_TX_OFFSET),
++ (0x0<<I2S_FMT_RX_OFFSET));
++ break;
++ case SND_SOC_DAIFMT_LEFT_J:
++ snd_soc_component_update_bits(component, AC_I2S_CLK,
++ (0x3FF<<I2S_LRCK_PERIOD),
++ (0x1F<<I2S_LRCK_PERIOD));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x3<<I2S_FMT_MODE), (0x1<<I2S_FMT_MODE));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_TX_OFFSET),
++ (0x0<<I2S_FMT_TX_OFFSET));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_RX_OFFSET),
++ (0x0<<I2S_FMT_RX_OFFSET));
++ break;
++ case SND_SOC_DAIFMT_DSP_A:
++ snd_soc_component_update_bits(component, AC_I2S_CLK,
++ (0x3FF<<I2S_LRCK_PERIOD),
++ (0x3F<<I2S_LRCK_PERIOD));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x3<<I2S_FMT_MODE), (0x0<<I2S_FMT_MODE));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_TX_OFFSET),
++ (0x1<<I2S_FMT_TX_OFFSET));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_RX_OFFSET),
++ (0x1<<I2S_FMT_RX_OFFSET));
++ break;
++ case SND_SOC_DAIFMT_DSP_B:
++ snd_soc_component_update_bits(component, AC_I2S_CLK,
++ (0x3FF<<I2S_LRCK_PERIOD),
++ (0x3F<<I2S_LRCK_PERIOD));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x3<<I2S_FMT_MODE), (0x0<<I2S_FMT_MODE));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_TX_OFFSET),
++ (0x0<<I2S_FMT_TX_OFFSET));
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_RX_OFFSET),
++ (0x0<<I2S_FMT_RX_OFFSET));
++ break;
++ default:
++ dev_err(component->dev, "format setting failed\n");
++ break;
++ }
++
++ switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
++ case SND_SOC_DAIFMT_NB_NF:
++ snd_soc_component_update_bits(component, AC_I2S_FMT1,
++ (0x1<<I2S_FMT_BCLK_POLAR),
++ (0x0<<I2S_FMT_BCLK_POLAR));
++ snd_soc_component_update_bits(component, AC_I2S_FMT1,
++ (0x1<<I2S_FMT_LRCK_POLAR),
++ (0x0<<I2S_FMT_LRCK_POLAR));
++ break;
++ case SND_SOC_DAIFMT_NB_IF:
++ snd_soc_component_update_bits(component, AC_I2S_FMT1,
++ (0x1<<I2S_FMT_BCLK_POLAR),
++ (0x0<<I2S_FMT_BCLK_POLAR));
++ snd_soc_component_update_bits(component, AC_I2S_FMT1,
++ (0x1<<I2S_FMT_LRCK_POLAR),
++ (0x1<<I2S_FMT_LRCK_POLAR));
++ break;
++ case SND_SOC_DAIFMT_IB_NF:
++ snd_soc_component_update_bits(component, AC_I2S_FMT1,
++ (0x1<<I2S_FMT_BCLK_POLAR),
++ (0x1<<I2S_FMT_BCLK_POLAR));
++ snd_soc_component_update_bits(component, AC_I2S_FMT1,
++ (0x1<<I2S_FMT_LRCK_POLAR),
++ (0x0<<I2S_FMT_LRCK_POLAR));
++ break;
++ case SND_SOC_DAIFMT_IB_IF:
++ snd_soc_component_update_bits(component, AC_I2S_FMT1,
++ (0x1<<I2S_FMT_BCLK_POLAR),
++ (0x1<<I2S_FMT_BCLK_POLAR));
++ snd_soc_component_update_bits(component, AC_I2S_FMT1,
++ (0x1<<I2S_FMT_LRCK_POLAR),
++ (0x1<<I2S_FMT_LRCK_POLAR));
++ break;
++ default:
++ dev_err(component->dev, "invert clk setting failed\n");
++ return -EINVAL;
++ }
++ return 0;
++}
++
++static int acx00_codec_dai_set_clkdiv(struct snd_soc_dai *codec_dai,
++ int clk_id, int clk_div)
++{
++ struct acx00_priv *priv = snd_soc_dai_get_drvdata(codec_dai);
++ struct snd_soc_component *component = priv->component;
++ unsigned int bclk_div;
++ /*
++ * when PCM mode, setting as 64fs, when I2S mode as 32fs,
++ * then two channel, then just as 64fs
++ */
++ unsigned int div_ratio = clk_div / 64;
++
++ switch (div_ratio) {
++ case 1:
++ bclk_div = I2S_BCLK_DIV_1;
++ break;
++ case 2:
++ bclk_div = I2S_BCLK_DIV_2;
++ break;
++ case 4:
++ bclk_div = I2S_BCLK_DIV_3;
++ break;
++ case 6:
++ bclk_div = I2S_BCLK_DIV_4;
++ break;
++ case 8:
++ bclk_div = I2S_BCLK_DIV_5;
++ break;
++ case 12:
++ bclk_div = I2S_BCLK_DIV_6;
++ break;
++ case 16:
++ bclk_div = I2S_BCLK_DIV_7;
++ break;
++ case 24:
++ bclk_div = I2S_BCLK_DIV_8;
++ break;
++ case 32:
++ bclk_div = I2S_BCLK_DIV_9;
++ break;
++ case 48:
++ bclk_div = I2S_BCLK_DIV_10;
++ break;
++ case 64:
++ bclk_div = I2S_BCLK_DIV_11;
++ break;
++ case 96:
++ bclk_div = I2S_BCLK_DIV_12;
++ break;
++ case 128:
++ bclk_div = I2S_BCLK_DIV_13;
++ break;
++ case 176:
++ bclk_div = I2S_BCLK_DIV_14;
++ break;
++ case 192:
++ bclk_div = I2S_BCLK_DIV_15;
++ break;
++ default:
++ dev_err(component->dev, "setting blck div failed\n");
++ break;
++ }
++
++ snd_soc_component_update_bits(component, AC_I2S_CLK,
++ (I2S_BCLK_DIV_MASK<<I2S_BLCK_DIV),
++ (bclk_div<<I2S_BLCK_DIV));
++ return 0;
++}
++
++static int acx00_codec_startup(struct snd_pcm_substream *substream,
++ struct snd_soc_dai *codec_dai)
++{
++ return 0;
++}
++
++static bool acx00_loop_en;
++module_param(acx00_loop_en, bool, 0644);
++MODULE_PARM_DESC(acx00_loop_en, "ACX00-Codec audio loopback debug(Y=enable, N=disable)");
++
++static int acx00_codec_trigger(struct snd_pcm_substream *substream,
++ int cmd, struct snd_soc_dai *codec_dai)
++{
++ struct snd_soc_component *component = codec_dai->component;
++ return 0;
++}
++
++static int acx00_codec_prepare(struct snd_pcm_substream *substream,
++ struct snd_soc_dai *codec_dai)
++{
++ struct snd_soc_component *component = codec_dai->component;
++
++ snd_soc_component_update_bits(component, AC_SYS_CLK_CTL,
++ (0x1<<SYS_CLK_I2S), (0x1<<SYS_CLK_I2S));
++ snd_soc_component_update_bits(component, AC_SYS_MOD_RST,
++ (0x1<<MOD_RST_I2S), (0x1<<MOD_RST_I2S));
++
++ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
++ if (acx00_loop_en)
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_LOOP),
++ (0x1<<I2S_FMT_LOOP));
++ else
++ snd_soc_component_update_bits(component, AC_I2S_FMT0,
++ (0x1<<I2S_FMT_LOOP),
++ (0x0<<I2S_FMT_LOOP));
++ acx00_codec_txctrl_enable(component, 1);
++ } else
++ acx00_codec_rxctrl_enable(component, 1);
++ return 0;
++}
++
++static int acx00_codec_digital_mute(struct snd_soc_dai *codec_dai,
++ int mute)
++{
++ struct snd_soc_component *component = codec_dai->component;
++
++ if (mute)
++ snd_soc_component_write(component, AC_I2S_DAC_VOL, 0);
++ else
++ snd_soc_component_write(component, AC_I2S_DAC_VOL, ACX00_DEF_VOL);
++ return 0;
++}
++
++static void acx00_codec_shutdown(struct snd_pcm_substream *substream,
++ struct snd_soc_dai *dai)
++{
++ struct snd_soc_component *component = dai->component;
++
++ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
++ acx00_codec_txctrl_enable(component, 0);
++ else
++ acx00_codec_rxctrl_enable(component, 0);
++}
++
++static const struct snd_soc_dai_ops acx00_codec_dai_ops = {
++ .hw_params = acx00_codec_hw_params,
++ .shutdown = acx00_codec_shutdown,
++// .digital_mute = acx00_codec_digital_mute,
++ .set_sysclk = acx00_codec_dai_set_sysclk,
++ .set_fmt = acx00_codec_dai_set_fmt,
++ .set_clkdiv = acx00_codec_dai_set_clkdiv,
++ .startup = acx00_codec_startup,
++ .trigger = acx00_codec_trigger,
++ .prepare = acx00_codec_prepare,
++};
++
++static struct snd_soc_dai_driver acx00_codec_dai[] = {
++ {
++ .name = "acx00-dai",
++ .playback = {
++ .stream_name = "Playback",
++ .channels_min = 1,
++ .channels_max = 2,
++ .rates = SNDRV_PCM_RATE_8000_192000
++ | SNDRV_PCM_RATE_KNOT,
++ .formats = SNDRV_PCM_FMTBIT_S16_LE
++ | SNDRV_PCM_FMTBIT_S24_LE
++ | SNDRV_PCM_FMTBIT_S32_LE,
++ },
++
++ .capture = {
++ .stream_name = "Capture",
++ .channels_min = 1,
++ .channels_max = 2,
++ .rates = SNDRV_PCM_RATE_8000_192000
++ | SNDRV_PCM_RATE_KNOT,
++ .formats = SNDRV_PCM_FMTBIT_S16_LE
++ | SNDRV_PCM_FMTBIT_S24_LE
++ | SNDRV_PCM_FMTBIT_S32_LE,
++ },
++
++ .ops = &acx00_codec_dai_ops,
++ },
++};
++
++static void acx00_codec_resume_work(struct work_struct *work)
++{
++ struct acx00_priv *priv = container_of(work,
++ struct acx00_priv, resume_work.work);
++
++ acx00_codec_init(priv->component);
++}
++
++static int acx00_codec_probe(struct snd_soc_component *component)
++{
++ struct acx00_priv *priv = snd_soc_component_get_drvdata(component);
++ struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
++ int ret = 0;
++
++ mutex_init(&priv->mutex);
++
++ priv->component = component;
++#if 0
++ /* Add virtual switch */
++ ret = snd_soc_add_component_controls(component, acx00_codec_controls,
++ ARRAY_SIZE(acx00_codec_controls));
++ if (ret) {
++ pr_err("[audio-codec] Failed to register audio mode control, will continue without it.\n");
++ }
++ snd_soc_dapm_new_controls(dapm, acx00_codec_dapm_widgets, ARRAY_SIZE(acx00_codec_dapm_widgets));
++ snd_soc_dapm_add_routes(dapm, acx00_codec_dapm_routes, ARRAY_SIZE(acx00_codec_dapm_routes));
++#endif
++ /* using late_initcall to wait 120ms acx00-core to make chip reset */
++ acx00_codec_init(component);
++ INIT_DELAYED_WORK(&priv->spk_work, acx00_spk_enable);
++ INIT_DELAYED_WORK(&priv->resume_work, acx00_codec_resume_work);
++ return 0;
++}
++
++static void acx00_codec_remove(struct snd_soc_component *component)
++{
++ struct acx00_priv *priv = snd_soc_component_get_drvdata(component);
++
++ cancel_delayed_work_sync(&priv->spk_work);
++ cancel_delayed_work_sync(&priv->resume_work);
++}
++
++static unsigned int acx00_codec_read(struct snd_soc_component *component,
++ unsigned int reg)
++{
++ unsigned int data;
++ struct acx00_priv *priv = snd_soc_component_get_drvdata(component);
++
++ /* Device I/O API */
++ data = acx00_reg_read(priv->acx00, reg);
++ return data;
++}
++
++static int acx00_codec_write(struct snd_soc_component *component,
++ unsigned int reg, unsigned int value)
++{
++ struct acx00_priv *priv = snd_soc_component_get_drvdata(component);
++
++ return acx00_reg_write(priv->acx00, reg, value);
++}
++
++static int sunxi_gpio_iodisable(u32 gpio)
++{
++ char pin_name[8];
++ u32 config, ret;
++#if 0
++ sunxi_gpio_to_name(gpio, pin_name);
++ config = 7 << 16;
++ ret = pin_config_set(SUNXI_PINCTRL, pin_name, config);
++#endif
++ return ret;
++}
++
++static int acx00_codec_suspend(struct snd_soc_component *component)
++{
++ struct acx00_priv *priv = snd_soc_component_get_drvdata(component);
++
++ pr_debug("Enter %s\n", __func__);
++
++ clk_disable_unprepare(priv->clk);
++
++ /* PA_CTRL first setting low state, then make it iodisabled */
++ if (priv->spk_gpio_used) {
++ sunxi_gpio_iodisable(priv->spk_gpio);
++ msleep(30);
++ }
++
++ /*
++ * when codec suspend, then the register reset, if auto reset produce
++ * Pop & Click noise, then we should cut down the LINEOUT in this town.
++ */
++ if (priv->enable) {
++ snd_soc_component_update_bits(component, AC_LINEOUT_CTL,
++ (1<<LINEOUT_EN), (0<<LINEOUT_EN));
++ snd_soc_component_update_bits(priv->component, AC_LINEOUT_CTL,
++ (1<<LINEL_SRC_EN), (0<<LINEL_SRC_EN));
++ snd_soc_component_update_bits(priv->component, AC_LINEOUT_CTL,
++ (1<<LINER_SRC_EN), (0<<LINER_SRC_EN));
++ priv->enable = 0;
++ }
++
++ pr_debug("Exit %s\n", __func__);
++
++ return 0;
++}
++
++static int acx00_codec_resume(struct snd_soc_component *component)
++{
++ struct acx00_priv *priv = snd_soc_component_get_drvdata(component);
++
++ pr_debug("Enter %s\n", __func__);
++
++ if (clk_prepare_enable(priv->clk)) {
++ dev_err(component->dev, "codec resume clk failed\n");
++ return -EBUSY;
++ }
++
++ schedule_delayed_work(&priv->resume_work, msecs_to_jiffies(300));
++
++ if (priv->spk_gpio_used) {
++ gpio_direction_output(priv->spk_gpio, 1);
++ gpio_set_value(priv->spk_gpio, 0);
++ }
++
++ pr_debug("Exit %s\n", __func__);
++
++ return 0;
++}
++
++
++static int acx00_codec_set_bias_level(struct snd_soc_component *component,
++ enum snd_soc_bias_level level)
++{
++ component->dapm.bias_level = level;
++ return 0;
++}
++
++struct label {
++ const char *name;
++ int value;
++};
++
++#define LABEL(constant) { #constant, constant }
++#define LABEL_END { NULL, -1 }
++
++static struct label reg_labels[] = {
++ LABEL(AC_SYS_CLK_CTL),
++ LABEL(AC_SYS_MOD_RST),
++ LABEL(AC_SYS_SR_CTL),
++ LABEL(AC_I2S_CTL),
++ LABEL(AC_I2S_CLK),
++ LABEL(AC_I2S_FMT0),
++ LABEL(AC_I2S_FMT1),
++ LABEL(AC_I2S_MIXER_SRC),
++ LABEL(AC_I2S_MIXER_GAIN),
++ LABEL(AC_I2S_DAC_VOL),
++ LABEL(AC_I2S_ADC_VOL),
++ LABEL(AC_DAC_CTL),
++ LABEL(AC_DAC_MIXER_SRC),
++ LABEL(AC_DAC_MIXER_GAIN),
++ LABEL(AC_OUT_MIXER_CTL),
++ LABEL(AC_OUT_MIXER_SRC),
++ LABEL(AC_LINEOUT_CTL),
++ LABEL(AC_ADC_CTL),
++ LABEL(AC_MICBIAS_CTL),
++ LABEL(AC_ADC_MIC_CTL),
++ LABEL(AC_ADC_MIXER_SRC),
++ LABEL(AC_BIAS_CTL),
++ LABEL(AC_ANALOG_PROF_CTL),
++ LABEL_END,
++};
++
++static ssize_t show_audio_reg(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ struct acx00_priv *priv = dev_get_drvdata(dev);
++ int count = 0, i = 0;
++ unsigned int reg_val;
++
++ count += sprintf(buf, "dump audio reg:\n");
++
++ while (reg_labels[i].name != NULL) {
++ reg_val = acx00_reg_read(priv->acx00, reg_labels[i].value);
++ count += sprintf(buf + count, "%s 0x%x: 0x%x\n",
++ reg_labels[i].name, (reg_labels[i].value), reg_val);
++ i++;
++ }
++
++ return count;
++}
++
++/*
++ * param 1: 0 read;1 write
++ * param 2: 1 digital reg; 2 analog reg
++ * param 3: reg value;
++ * param 4: write value;
++ * read:
++ * echo 0,1,0x00> audio_reg
++ * echo 0,2,0x00> audio_reg
++ * write:
++ * echo 1,1,0x00,0xa > audio_reg
++ * echo 1,2,0x00,0xff > audio_reg
++*/
++static ssize_t store_audio_reg(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t count)
++{
++ int ret;
++ int rw_flag;
++ unsigned int input_reg_val = 0;
++ int input_reg_group = 0;
++ unsigned int input_reg_offset = 0;
++ struct acx00_priv *priv = dev_get_drvdata(dev);
++
++ ret = sscanf(buf, "%d,%d,0x%x,0x%x", &rw_flag, &input_reg_group,
++ &input_reg_offset, &input_reg_val);
++ dev_info(dev, "ret:%d, reg_group:%d, reg_offset:%d, reg_val:0x%x\n",
++ ret, input_reg_group, input_reg_offset, input_reg_val);
++
++ if (input_reg_group != 1) {
++ pr_err("not exist reg group\n");
++ ret = count;
++ goto out;
++ }
++ if (!(rw_flag == 1 || rw_flag == 0)) {
++ pr_err("not rw_flag\n");
++ ret = count;
++ goto out;
++ }
++
++ if (rw_flag) {
++ acx00_reg_write(priv->acx00, input_reg_offset, input_reg_val);
++ } else {
++ input_reg_val = acx00_reg_read(priv->acx00, input_reg_offset);
++ dev_info(dev, "\n\n Reg[0x%x] : 0x%04x\n\n",
++ input_reg_offset, input_reg_val);
++ }
++ ret = count;
++
++out:
++ return ret;
++}
++
++static DEVICE_ATTR(audio_reg, 0644, show_audio_reg, store_audio_reg);
++
++static struct attribute *audio_debug_attrs[] = {
++ &dev_attr_audio_reg.attr,
++ NULL,
++};
++
++static struct attribute_group audio_debug_attr_group = {
++ .name = "audio_reg_debug",
++ .attrs = audio_debug_attrs,
++};
++
++static struct snd_soc_component_driver soc_codec_driver_acx00 = {
++ .probe = acx00_codec_probe,
++ .remove = acx00_codec_remove,
++ .suspend = acx00_codec_suspend,
++ .resume = acx00_codec_resume,
++ .read = acx00_codec_read,
++ .write = acx00_codec_write,
++// .ignore_pmdown_time = 1,
++ .set_bias_level = acx00_codec_set_bias_level,
++ .controls = acx00_codec_controls,
++ .num_controls = ARRAY_SIZE(acx00_codec_controls),
++ .dapm_widgets = acx00_codec_dapm_widgets,
++ .num_dapm_widgets = ARRAY_SIZE(acx00_codec_dapm_widgets),
++ .dapm_routes = acx00_codec_dapm_routes,
++ .num_dapm_routes = ARRAY_SIZE(acx00_codec_dapm_routes),
++};
++
++/* through acx00 is part of mfd devices, after the mfd */
++static int acx00_codec_dev_probe(struct platform_device *pdev)
++{
++ struct acx00_priv *priv;
++ int ret;
++ struct device_node *np = of_find_compatible_node(NULL, NULL, "allwinner,ac200_codec");
++
++ priv = devm_kzalloc(&pdev->dev, sizeof(struct acx00_priv), GFP_KERNEL);
++ if (!priv) {
++ dev_err(&pdev->dev, "acx00 codec priv mem alloc failed\n");
++ return -ENOMEM;
++ }
++
++ platform_set_drvdata(pdev, priv);
++ priv->acx00 = dev_get_drvdata(pdev->dev.parent);
++
++ if (np) {
++ ret = of_get_named_gpio(np, "gpio-spk", 0);
++ if (ret >= 0) {
++ priv->spk_gpio_used = 1;
++ priv->spk_gpio = ret;
++ if (!gpio_is_valid(priv->spk_gpio)) {
++ dev_err(&pdev->dev, "gpio-spk is valid\n");
++ ret = -EINVAL;
++ goto err_devm_kfree;
++ } else {
++ ret = devm_gpio_request(&pdev->dev,
++ priv->spk_gpio, "SPK");
++ if (ret) {
++ dev_err(&pdev->dev,
++ "failed request gpio-spk\n");
++ ret = -EBUSY;
++ goto err_devm_kfree;
++ } else {
++ gpio_direction_output(priv->spk_gpio,
++ 1);
++ gpio_set_value(priv->spk_gpio, 0);
++ }
++ }
++ } else {
++ priv->spk_gpio_used = 0;
++ }
++
++ ret = of_get_named_gpio(np, "gpio-switch", 0);
++ if (ret >= 0) {
++ priv->switch_gpio = ret;
++ if (!gpio_is_valid(priv->switch_gpio)) {
++ dev_err(&pdev->dev, "gpio-switch is valid\n");
++ ret = -EINVAL;
++ goto err_devm_kfree;
++ } else {
++ ret = devm_gpio_request(&pdev->dev, priv->switch_gpio, "SWITCH");
++ if (ret) {
++ dev_err(&pdev->dev,
++ "failed request gpio-switch\n");
++ ret = -EBUSY;
++ goto err_devm_kfree;
++ } else {
++ gpio_direction_output(priv->switch_gpio, 1);
++ gpio_set_value(priv->switch_gpio, 1);
++ }
++ }
++ }
++ }
++
++ ret = snd_soc_register_component(&pdev->dev, &soc_codec_driver_acx00,
++ acx00_codec_dai, ARRAY_SIZE(acx00_codec_dai));
++
++ if (ret < 0)
++ dev_err(&pdev->dev, "Failed register acx00: %d\n", ret);
++
++ ret = sysfs_create_group(&pdev->dev.kobj, &audio_debug_attr_group);
++ if (ret)
++ dev_warn(&pdev->dev, "failed to create attr group\n");
++
++ return 0;
++
++err_devm_kfree:
++ devm_kfree(&pdev->dev, priv);
++ return ret;
++}
++
++/* Mark this space to clear the LINEOUT & gpio */
++static void acx00_codec_dev_shutdown(struct platform_device *pdev)
++{
++ struct acx00_priv *priv = platform_get_drvdata(pdev);
++
++ if (priv->spk_gpio_used)
++ gpio_set_value(priv->spk_gpio, 0);
++}
++
++static int acx00_codec_dev_remove(struct platform_device *pdev)
++{
++ struct acx00_priv *priv = platform_get_drvdata(pdev);
++
++#ifndef ACX00_DAPM_LINEOUT
++ /*
++ snd_soc_component_update_bits(priv->component, AC_LINEOUT_CTL,
++ (1<<LINEOUT_EN), (0<<LINEOUT_EN));
++ */
++#endif
++ snd_soc_unregister_component(&pdev->dev);
++ clk_disable_unprepare(priv->clk);
++ devm_kfree(&pdev->dev, priv);
++ return 0;
++}
++
++static const struct of_device_id acx00_codec_match[] = {
++ { .compatible = "x-powers,ac200-codec" },
++ { }
++};
++MODULE_DEVICE_TABLE(of, acx00_codec_match);
++
++static struct platform_driver acx00_codec_driver = {
++ .driver = {
++ .name = "acx00-codec",
++ .of_match_table = acx00_codec_match,
++ },
++ .probe = acx00_codec_dev_probe,
++ .remove = acx00_codec_dev_remove,
++ .shutdown = acx00_codec_dev_shutdown,
++};
++
++static int __init acx00_codec_driver_init(void)
++{
++ return platform_driver_register(&acx00_codec_driver);
++}
++
++static void __exit acx00_codec_driver_exit(void)
++{
++ platform_driver_unregister(&acx00_codec_driver);
++}
++late_initcall(acx00_codec_driver_init);
++module_exit(acx00_codec_driver_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_DESCRIPTION("SUNXI ASoC ACX00 Codec Driver");
++MODULE_AUTHOR("wolfgang huang");
++MODULE_ALIAS("platform:acx00-codec");
+diff --git a/sound/soc/codecs/acx00.h b/sound/soc/codecs/acx00.h
+new file mode 100644
+index 000000000..5137cf365
+--- /dev/null
++++ b/sound/soc/codecs/acx00.h
+@@ -0,0 +1,356 @@
++/*
++ * sound\soc\codecs\acx00.h
++ * (C) Copyright 2012-2016
++ * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
++ * Wolfgang Huang <huangjinhui@allwinnertech.com>
++ *
++ * some simple description for this code
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ */
++
++#ifndef __ACX00_H_
++#define __ACX00_H_
++
++/* ACX00 register offset list */
++#define AC_SYS_CLK_CTL 0x2000
++#define AC_SYS_MOD_RST 0x2002
++#define AC_SYS_SR_CTL 0x2004
++/* Left blank */
++#define AC_I2S_CTL 0x2100
++#define AC_I2S_CLK 0x2102
++#define AC_I2S_FMT0 0x2104
++/* Left blank */
++#define AC_I2S_FMT1 0x2108
++/* Left blank */
++#define AC_I2S_MIXER_SRC 0x2114
++#define AC_I2S_MIXER_GAIN 0x2116
++#define AC_I2S_DAC_VOL 0x2118
++#define AC_I2S_ADC_VOL 0x211A
++/* Left blank */
++#define AC_DAC_CTL 0x2200
++#define AC_DAC_MIXER_SRC 0x2202
++#define AC_DAC_MIXER_GAIN 0x2204
++/* Left blank */
++#define AC_OUT_MIXER_CTL 0x2220
++#define AC_OUT_MIXER_SRC 0x2222
++#define AC_LINEOUT_CTL 0x2224
++/* Left blank */
++#define AC_ADC_CTL 0x2300
++/* Left blank */
++#define AC_MICBIAS_CTL 0x2310
++/* Left blank */
++#define AC_ADC_MIC_CTL 0x2320
++#define AC_ADC_MIXER_SRC 0x2322
++/* Left blank */
++#define AC_BIAS_CTL 0x232A
++#define AC_ANALOG_PROF_CTL 0x232C
++/* Left blank */
++#define AC_ADC_DAPL_CTRL 0x2500
++#define AC_ADC_DAPR_CTRL 0x2502
++#define AC_ADC_DAPLSTA 0x2504
++#define AC_ADC_DAPRSTA 0x2506
++#define AC_ADC_DAP_LTL 0x2508
++#define AC_ADC_DAP_RTL 0x250A
++#define AC_ADC_DAP_LHAC 0x250C
++#define AC_ADC_DAP_LLAC 0x250E
++#define AC_ADC_DAP_RHAC 0x2510
++#define AC_ADC_DAP_RLAC 0x2512
++#define AC_ADC_DAP_LDT 0x2514
++#define AC_ADC_DAP_LAT 0x2516
++#define AC_ADC_DAP_RDT 0x2518
++#define AC_ADC_DAP_RAT 0x251A
++#define AC_ADC_DAP_NTH 0x251C
++#define AC_ADC_DAP_LHNAC 0x251E
++#define AC_ADC_DAP_LLNAC 0x2520
++#define AC_ADC_DAP_RHNAC 0x2522
++#define AC_ADC_DAP_RLNAC 0x2524
++#define AC_ADC_DAP_HHPFC 0x2526
++#define AC_ADC_DAP_LHPFC 0x2528
++#define AC_ADC_DAP_OPT 0x252A
++/* Left blank */
++#define AC_AGC_SEL 0x2480
++/* Left blank */
++#define AC_ADC_DAPL_CTRL 0x2500
++#define AC_ADC_DAPR_CTRL 0x2502
++#define AC_ADC_DAPLSTA 0x2504
++#define AC_ADC_DAPRSTA 0x2506
++#define AC_ADC_DAP_LTL 0x2508
++#define AC_ADC_DAP_RTL 0x250A
++#define AC_ADC_DAP_LHAC 0x250C
++#define AC_ADC_DAP_LLAC 0x250E
++#define AC_ADC_DAP_RHAC 0x2510
++#define AC_ADC_DAP_RLAC 0x2512
++#define AC_ADC_DAP_LDT 0x2514
++#define AC_ADC_DAP_LAT 0x2516
++#define AC_ADC_DAP_RDT 0x2518
++#define AC_ADC_DAP_RAT 0x251A
++#define AC_ADC_DAP_NTH 0x251C
++#define AC_ADC_DAP_LHNAC 0x251E
++#define AC_ADC_DAP_LLNAC 0x2520
++#define AC_ADC_DAP_RHNAC 0x2522
++#define AC_ADC_DAP_RLNAC 0x2524
++#define AC_ADC_DAP_HHPFC 0x2526
++#define AC_ADC_DAP_LHPFC 0x2528
++#define AC_ADC_DAP_OPT 0x252A
++/* Left blank */
++#define AC_DRC_SEL 0x2f80
++/* Left blank */
++#define AC_DRC_CHAN_CTRL 0x3000
++#define AC_DRC_HHPFC 0x3002
++#define AC_DRC_LHPFC 0x3004
++#define AC_DRC_CTRL 0x3006
++#define AC_DRC_LPFHAT 0x3008
++#define AC_DRC_LPFLAT 0x300A
++#define AC_DRC_RPFHAT 0x300C
++#define AC_DRC_RPFLAT 0x300E
++#define AC_DRC_LPFHRT 0x3010
++#define AC_DRC_LPFLRT 0x3012
++#define AC_DRC_RPFHRT 0x3014
++#define AC_DRC_RPFLRT 0x3016
++#define AC_DRC_LRMSHAT 0x3018
++#define AC_DRC_LRMSLAT 0x301A
++#define AC_DRC_RRMSHAT 0x301C
++#define AC_DRC_RRMSLAT 0x301E
++#define AC_DRC_HCT 0x3020
++#define AC_DRC_LCT 0x3022
++#define AC_DRC_HKC 0x3024
++#define AC_DRC_LKC 0x3026
++#define AC_DRC_HOPC 0x3028
++#define AC_DRC_LOPC 0x302A
++#define AC_DRC_HLT 0x302C
++#define AC_DRC_LLT 0x302E
++#define AC_DRC_HKI 0x3030
++#define AC_DRC_LKI 0x3032
++#define AC_DRC_HOPL 0x3034
++#define AC_DRC_LOPL 0x3036
++#define AC_DRC_HET 0x3038
++#define AC_DRC_LET 0x303A
++#define AC_DRC_HKE 0x303C
++#define AC_DRC_LKE 0x303E
++#define AC_DRC_HOPE 0x3040
++#define AC_DRC_LOPE 0x3042
++#define AC_DRC_HKN 0x3044
++#define AC_DRC_LKN 0x3046
++#define AC_DRC_SFHAT 0x3048
++#define AC_DRC_SFLAT 0x304A
++#define AC_DRC_SFHRT 0x304C
++#define AC_DRC_SFLRT 0x304E
++#define AC_DRC_MXGHS 0x3050
++#define AC_DRC_MXGLS 0x3052
++#define AC_DRC_MNGHS 0x3054
++#define AC_DRC_MNGLS 0x3056
++#define AC_DRC_EPSHC 0x3058
++#define AC_DRC_EPSLC 0x305A
++#define AC_DRC_OPT 0x305C
++#define AC_DRC_HPFHGAIN 0x305E
++#define AC_DRC_HPFLGAIN 0x3060
++#define AC_DRC_BISTCR 0x3100
++#define AC_DRC_BISTST 0x3102
++
++/* AC_SYS_CLK_CTL : 0x2000 */
++#define SYS_CLK_I2S 15
++#define SYS_CLK_AGC 7
++#define SYS_CLK_DRC 6
++#define SYS_CLK_ADC 3
++#define SYS_CLK_DAC 2
++
++/* AC_SYS_MOD_RST : 0x2002 */
++#define MOD_RST_I2S 15
++#define MOD_RST_AGC 7
++#define MOD_RST_DRC 6
++#define MOD_RST_ADC 3
++#define MOD_RST_DAC 2
++
++/* AC_SYS_SR_CTL : 0x2004 */
++#define SYS_SR_BIT 0
++#define SYS_SR_MASK 0xF
++#define SYS_SR_BIT_0 0 /* 8000 */
++#define SYS_SR_BIT_1 1 /* 11025 */
++#define SYS_SR_BIT_2 2 /* 12000 */
++#define SYS_SR_BIT_3 3 /* 16000 */
++#define SYS_SR_BIT_4 4 /* 22050 */
++#define SYS_SR_BIT_5 5 /* 24000 */
++#define SYS_SR_BIT_6 6 /* 32000 */
++#define SYS_SR_BIT_7 7 /* 44100 */
++#define SYS_SR_BIT_8 8 /* 48000 */
++#define SYS_SR_BIT_9 9 /* 96000 */
++#define SYS_SR_BIT_10 10 /* 192000 */
++
++/* AC_I2S_CTL : 0x2100 */
++#define I2S_SDO0_EN 3
++#define I2S_TX_EN 2
++#define I2S_RX_EN 1
++#define I2S_GEN 0
++
++/* AC_I2S_CLK : 0x2102 */
++#define I2S_BCLK_OUT 15
++#define I2S_LRCK_OUT 14
++#define I2S_BLCK_DIV 10
++#define I2S_LRCK_PERIOD 0
++/* BCLK DIV Define */
++#define I2S_BCLK_DIV_MASK 0xF
++#define I2S_BCLK_DIV_1 1
++#define I2S_BCLK_DIV_2 2
++#define I2S_BCLK_DIV_3 3
++#define I2S_BCLK_DIV_4 4
++#define I2S_BCLK_DIV_5 5
++#define I2S_BCLK_DIV_6 6
++#define I2S_BCLK_DIV_7 7
++#define I2S_BCLK_DIV_8 8
++#define I2S_BCLK_DIV_9 9
++#define I2S_BCLK_DIV_10 10
++#define I2S_BCLK_DIV_11 11
++#define I2S_BCLK_DIV_12 12
++#define I2S_BCLK_DIV_13 13
++#define I2S_BCLK_DIV_14 14
++#define I2S_BCLK_DIV_15 15
++#define I2S_LRCK_PERIOD_MASK 0x3FF
++
++/* AC_I2S_FMT0 : 0x2104 */
++#define I2S_FMT_MODE 14
++#define I2S_FMT_TX_OFFSET 10
++#define I2S_FMT_RX_OFFSET 8
++#define I2S_FMT_SAMPLE 4
++#define I2S_FMT_SLOT_WIDTH 1
++#define I2S_FMT_LOOP 0
++
++/* AC_I2S_FMT1 : 0x2108 */
++#define I2S_FMT_BCLK_POLAR 15
++#define I2S_FMT_LRCK_POLAR 14
++#define I2S_FMT_EDGE_TRANSFER 13
++#define I2S_FMT_RX_MLS 11
++#define I2S_FMT_TX_MLS 10
++#define I2S_FMT_EXTEND 9
++#define I2S_FMT_LRCK_WIDTH 4 /* PCM long/short Frame */
++#define I2S_MFT_RX_PDM 2
++#define I2S_FMT_TX_PDM 0
++
++/* AC_I2S_MIXER_SRC : 0x2114 */
++#define I2S_MIXERL_SRC_DAC 13
++#define I2S_MIXERL_SRC_ADC 12
++#define I2S_MIXERR_SRC_DAC 9
++#define I2S_MIXERR_SRC_ADC 8
++
++/* AC_I2S_MIXER_GAIN : 0x2116 */
++#define I2S_MIXERL_GAIN_DAC 13
++#define I2S_MIXERL_GAIN_ADC 12
++#define I2S_MIXERR_GAIN_DAC 9
++#define I2S_MIXERR_GAIN_ADC 8
++
++
++/* AC_I2S_DAC_VOL : 0x2118 */
++#define I2S_DACL_VOL 8
++#define I2S_DACR_VOL 0
++
++/* AC_I2S_ADC_VOL : 0x211A */
++#define I2S_ADCL_VOL 8
++#define I2S_ADCR_VOL 0
++
++/* AC_DAC_CTL : 0x2200 */
++#define DAC_CTL_DAC_EN 15
++#define DAC_CTL_HPF_EN 14
++#define DAC_CTL_FIR 13
++#define DAC_CTL_MODQU 8
++
++/* AC_DAC_MIXER_SRC : 0x2202 */
++#define DAC_MIXERL_SRC_DAC 13
++#define DAC_MIXERL_SRC_ADC 12
++#define DAC_MIXERR_SRC_DAC 9
++#define DAC_MIXERR_SRC_ADC 8
++
++/* AC_DAC_MIXER_GAIN : 0x2204 */
++#define DAC_MIXERL_GAIN_DAC 13
++#define DAC_MIXERL_GAIN_ADC 12
++#define DAC_MIXERR_GAIN_DAC 9
++#define DAC_MIXERR_GAIN_ADC 8
++
++/* AC_OUT_MIXER_CTL : 0x2220 */
++#define OUT_MIXER_DACR_EN 15
++#define OUT_MIXER_DACL_EN 14
++#define OUT_MIXER_RMIX_EN 13
++#define OUT_MIXER_LMIX_EN 12
++#define OUT_MIXER_LINE_VOL 8
++#define OUT_MIXER_MIC1_VOL 4
++#define OUT_MIXER_MIC2_VOL 0
++
++/* AC_OUT_MIXER_SRC : 0x2222 */
++#define OUT_MIXERR_SRC_MIC1 14
++#define OUT_MIXERR_SRC_MIC2 13
++#define OUT_MIXERR_SRC_PHPN 12
++#define OUT_MIXERR_SRC_PHP 11
++#define OUT_MIXERR_SRC_LINER 10
++#define OUT_MIXERR_SRC_DACR 9
++#define OUT_MIXERR_SRC_DACL 8
++#define OUT_MIXERL_SRC_MIC1 6
++#define OUT_MIXERL_SRC_MIC2 5
++#define OUT_MIXERL_SRC_PHPN 4
++#define OUT_MIXERL_SRC_PHN 3
++#define OUT_MIXERL_SRC_LINEL 2
++#define OUT_MIXERL_SRC_DACL 1
++#define OUT_MIXERL_SRC_DACR 0
++
++/* AC_LINEOUT_CTL : 0x2224 */
++#define LINEOUT_EN 15
++#define LINEL_SRC_EN 14
++#define LINER_SRC_EN 13
++#define LINEL_SRC 12
++#define LINER_SRC 11
++/* ramp just skip */
++#define LINE_SLOPE_SEL 8
++#define LINE_ANTI_TIME 5
++#define LINEOUT_VOL 0
++
++/* AC_ADC_CTL : 0x2300 */
++#define ADC_EN 15
++#define ADC_ENDM 14
++#define ADC_FIR 13
++#define ADC_DELAY_TIME 2
++#define ADC_DELAY_EN 1
++
++/* AC_MICBIAS_CTL : 0x2310 */
++#define MMBIAS_EN 15
++#define MMBIAS_CHOPPER 14
++#define MMBIAS_CHOP_CLK 12
++#define MMBIAS_SEL 8
++#define ADDA_BIAS_CUR 3
++
++/* AC_ADC_MIC_CTL : 0x2320 */
++#define ADCR_EN 15
++#define ADCL_EN 14
++#define ADC_GAIN 8
++#define MIC1_GAIN_EN 7
++#define MIC1_BOOST 4
++#define MIC2_GAIN_EN 3
++#define MIC2_BOOST 0
++
++/* AC_ADC_MIXER_SRC : 0x2322 */
++#define ADC_MIXERR_MIC1 14
++#define ADC_MIXERR_MIC2 13
++#define ADC_MIXERR_PHPN 12
++#define ADC_MIXERR_PHP 11
++#define ADC_MIXERR_LINER 10
++#define ADC_MIXERR_MIXR 9
++#define ADC_MIXERR_MIXL 8
++#define ADC_MIXERL_MIC1 6
++#define ADC_MIXERL_MIC2 5
++#define ADC_MIXERL_PHPN 4
++#define ADC_MIXERL_PHN 3
++#define ADC_MIXERL_LINEL 2
++#define ADC_MIXERL_MIXL 1
++#define ADC_MIXERL_MIXR 0
++
++/* AC_BIAS_CTL : 0x232A */
++
++/* AC_ANALOG_PROF_CTL : 0x232C */
++/* used for current performance measure */
++
++/* AC_DLDO_OSC_CTL : 0x2340 */
++/* AC_ALDO_CTL : 0x2342 */
++/* used for digital & analog LDO test... etc */
++
++#endif
+--
+2.25.1
+
diff --git a/0010-allwinner-add-sunxi_get_soc_chipid-and-sunxi_get_ser.patch b/0010-allwinner-add-sunxi_get_soc_chipid-and-sunxi_get_ser.patch
new file mode 100644
index 000000000000..4fc50184b485
--- /dev/null
+++ b/0010-allwinner-add-sunxi_get_soc_chipid-and-sunxi_get_ser.patch
@@ -0,0 +1,59 @@
+From caaa7def76801cbe9937602603f6b471f776e6f6 Mon Sep 17 00:00:00 2001
+From: The-going <48602507+The-going@users.noreply.github.com>
+Date: Sat, 16 Apr 2022 11:19:05 +0300
+Subject: [PATCH] nvmem: sunxi_sid: add sunxi_get_soc_chipid, sunxi_get_serial
+
+---
+ drivers/nvmem/sunxi_sid.c | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+diff --git a/drivers/nvmem/sunxi_sid.c b/drivers/nvmem/sunxi_sid.c
+index 37a6abb0e..c81fac63d 100644
+--- a/drivers/nvmem/sunxi_sid.c
++++ b/drivers/nvmem/sunxi_sid.c
+@@ -37,6 +37,25 @@ struct sunxi_sid {
+ u32 value_offset;
+ };
+
++static unsigned int sunxi_soc_chipid[4];
++static unsigned int sunxi_serial[4];
++
++int sunxi_get_soc_chipid(unsigned char *chipid)
++{
++ memcpy(chipid, sunxi_soc_chipid, 16);
++
++ return 0;
++}
++EXPORT_SYMBOL(sunxi_get_soc_chipid);
++
++int sunxi_get_serial(unsigned char *serial)
++{
++ memcpy(serial, sunxi_serial, 16);
++
++ return 0;
++}
++EXPORT_SYMBOL(sunxi_get_serial);
++
+ static int sunxi_sid_read(void *context, unsigned int offset,
+ void *val, size_t bytes)
+ {
+@@ -167,6 +186,15 @@ static int sunxi_sid_probe(struct platform_device *pdev)
+
+ platform_set_drvdata(pdev, nvmem);
+
++ nvmem_cfg->reg_read(sid, 0, &sunxi_soc_chipid[0], sizeof(int));
++ nvmem_cfg->reg_read(sid, 4, &sunxi_soc_chipid[1], sizeof(int));
++ nvmem_cfg->reg_read(sid, 8, &sunxi_soc_chipid[2], sizeof(int));
++ nvmem_cfg->reg_read(sid, 12, &sunxi_soc_chipid[3], sizeof(int));
++
++ sunxi_serial[0] = sunxi_soc_chipid[3];
++ sunxi_serial[1] = sunxi_soc_chipid[2];
++ sunxi_serial[2] = (sunxi_soc_chipid[1] >> 16) & 0x0ffff;
++
+ return 0;
+ }
+
+--
+2.34.1
+
+
diff --git a/0010-general-h6-add-dma-i2c-ir-spi-uart.patch b/0010-general-h6-add-dma-i2c-ir-spi-uart.patch
deleted file mode 100644
index 77cb4dabf281..000000000000
--- a/0010-general-h6-add-dma-i2c-ir-spi-uart.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
-index dc785da9c..141fd186b 100644
---- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
-+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
-@@ -374,6 +381,17 @@
- #dma-cells = <1>;
- };
-
-+ gic: interrupt-controller@3021000 {
-+ compatible = "arm,gic-400";
-+ reg = <0x03021000 0x1000>,
-+ <0x03022000 0x2000>,
-+ <0x03024000 0x2000>,
-+ <0x03026000 0x2000>;
-+ interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
-+ interrupt-controller;
-+ #interrupt-cells = <3>;
-+ };
-+
- sid: efuse@3006000 {
- compatible = "allwinner,sun50i-h6-sid";
- reg = <0x03006000 0x400>;
-@@ -279,6 +305,7 @@
- interrupt-controller;
- #interrupt-cells = <3>;
-
-+ /omit-if-no-ref/
- ext_rgmii_pins: rgmii-pins {
- pins = "PD0", "PD1", "PD2", "PD3", "PD4",
- "PD5", "PD7", "PD8", "PD9", "PD10",
-@@ -309,6 +354,7 @@
- bias-pull-up;
- };
-
-+ /omit-if-no-ref/
- mmc2_pins: mmc2-pins {
- pins = "PC1", "PC4", "PC5", "PC6",
- "PC7", "PC8", "PC9", "PC10",
-@@ -511,17 +540,26 @@
- pins = "PG8", "PG9";
- function = "uart1";
- };
-- };
-
-- gic: interrupt-controller@3021000 {
-- compatible = "arm,gic-400";
-- reg = <0x03021000 0x1000>,
-- <0x03022000 0x2000>,
-- <0x03024000 0x2000>,
-- <0x03026000 0x2000>;
-- interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
-- interrupt-controller;
-- #interrupt-cells = <3>;
-+ uart2_pins: uart2-pins {
-+ pins = "PD19", "PD20";
-+ function = "uart2";
-+ };
-+
-+ uart2_rts_cts_pins: uart2-rts-cts-pins {
-+ pins = "PD21", "PD22";
-+ function = "uart2";
-+ };
-+
-+ uart3_pins: uart3-pins {
-+ pins = "PD23", "PD24";
-+ function = "uart3";
-+ };
-+
-+ uart3_rts_cts_pins: uart3-rts-cts-pins {
-+ pins = "PD25", "PD26";
-+ function = "uart3";
-+ };
- };
-
- mmc0: mmc@4020000 {
-@@ -963,6 +1033,19 @@
- };
- };
-
-+ r_uart: serial@7080000 {
-+ compatible = "snps,dw-apb-uart";
-+ reg = <0x07080000 0x400>;
-+ interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
-+ reg-shift = <2>;
-+ reg-io-width = <4>;
-+ clocks = <&r_ccu CLK_R_APB2_UART>;
-+ resets = <&r_ccu RST_R_APB2_UART>;
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&r_uart_pins>;
-+ status = "disabled";
-+ };
-+
- rtc: rtc@7000000 {
- compatible = "allwinner,sun50i-h6-rtc";
- reg = <0x07000000 0x400>;
-@@ -1021,6 +1104,11 @@
- pins = "PL9";
- function = "s_cir_rx";
- };
-+
-+ r_uart_pins: r-uart-pins {
-+ pins = "PL2", "PL3";
-+ function = "s_uart";
-+ };
- };
-
- r_ir: ir@7040000 {
diff --git a/0012-arm64-h6-gpu-devfreq-enable.patch b/0012-arm64-h6-gpu-devfreq-enable.patch
index 589a8df898e4..ce34f1e07cef 100644
--- a/0012-arm64-h6-gpu-devfreq-enable.patch
+++ b/0012-arm64-h6-gpu-devfreq-enable.patch
@@ -143,6 +143,6 @@ index 199ab77..db61727 100644
+ val |= (62 << 8) | BIT(1);
+ writel(val, reg + SUN50I_H6_PLL_GPU_REG);
+
- return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_h6_ccu_desc);
+ return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_h6_ccu_desc);
}
diff --git a/0012-fix-h6-emmc.patch b/0012-fix-h6-emmc.patch
new file mode 100644
index 000000000000..e373b02365b5
--- /dev/null
+++ b/0012-fix-h6-emmc.patch
@@ -0,0 +1,38 @@
+From 9010972a9691d468eb68ab85c73c80bb572a5334 Mon Sep 17 00:00:00 2001
+From: Ukhellfire <afaulkner420@gmail.com>
+Date: Thu, 24 Mar 2022 22:21:00 +0000
+Subject: [PATCH] Fix H6 emmc
+
+We have the wrong MMC CAP voltage for the emmc on this board
+---
+ drivers/mmc/host/sunxi-mmc.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c
+index dd1c2a610..9a641c7d2 100644
+--- a/drivers/mmc/host/sunxi-mmc.c
++++ b/drivers/mmc/host/sunxi-mmc.c
+@@ -1221,5 +1221,6 @@ static const struct of_device_id sunxi_mmc_of_match[] = {
+ { .compatible = "allwinner,sun50i-a64-mmc", .data = &sun50i_a64_cfg },
+ { .compatible = "allwinner,sun50i-a64-emmc", .data = &sun50i_a64_emmc_cfg },
++ { .compatible = "allwinner,sun50i-h6-emmc", .data = &sun50i_a64_emmc_cfg },
+ { .compatible = "allwinner,sun50i-a100-mmc", .data = &sun50i_a100_cfg },
+ { .compatible = "allwinner,sun50i-a100-emmc", .data = &sun50i_a100_emmc_cfg },
+ { /* sentinel */ }
+@@ -1434,7 +1435,7 @@ static int sunxi_mmc_probe(struct platform_device *pdev)
+ MMC_CAP_SDIO_IRQ;
+
+ /*
+- * Some H5 devices do not have signal traces precise enough to
++ * Some H5 and H6 devices do not have signal traces precise enough to
+ * use HS DDR mode for their eMMC chips.
+ *
+ * We still enable HS DDR modes for all the other controller
+@@ -1443,4 +1444,6 @@ static int sunxi_mmc_probe(struct platform_device *pdev)
+ if ((host->cfg->clk_delays || host->use_new_timings) &&
+ !of_device_is_compatible(pdev->dev.of_node,
+- "allwinner,sun50i-h5-emmc"))
++ "allwinner,sun50i-h5-emmc") &&
++ !of_device_is_compatible(pdev->dev.of_node,
++ "allwinner,sun50i-h6-emmc"))
+ mmc->caps |= MMC_CAP_1_8V_DDR | MMC_CAP_3_3V_DDR;
diff --git a/0013-x-fix-h6-emmc-dts.patch b/0013-x-fix-h6-emmc-dts.patch
new file mode 100644
index 000000000000..91e8cb9dd9c4
--- /dev/null
+++ b/0013-x-fix-h6-emmc-dts.patch
@@ -0,0 +1,23 @@
+From cfafb3f609842d63de13ccaa356b3861ac52c603 Mon Sep 17 00:00:00 2001
+From: Ukhellfire <afaulkner420@gmail.com>
+Date: Fri, 25 Mar 2022 07:10:57 +0000
+Subject: [PATCH] Fix H6 emmc
+
+---
+ arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+index 40be5ad6d..3c6e9e875 100644
+--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+@@ -566,8 +566,7 @@
+ };
+
+ mmc2: mmc@4022000 {
+- compatible = "allwinner,sun50i-h6-emmc",
+- "allwinner,sun50i-a64-emmc";
++ compatible = "allwinner,sun50i-h6-emmc";
+ reg = <0x04022000 0x1000>;
+ clocks = <&ccu CLK_BUS_MMC2>, <&ccu CLK_MMC2>;
+ clock-names = "ahb", "mmc";
diff --git a/0040-wip-H6-deinterlace.patch b/0040-wip-H6-deinterlace.patch
deleted file mode 100644
index b5bb79679e74..000000000000
--- a/0040-wip-H6-deinterlace.patch
+++ /dev/null
@@ -1,1364 +0,0 @@
-From 91c70ea17b58c9205c35cd43a3dd8266bbe035b1 Mon Sep 17 00:00:00 2001
-From: Jernej Skrabec <jernej.skrabec@siol.net>
-Date: Mon, 25 May 2020 19:06:07 +0200
-Subject: [PATCH 40/44] wip: H6 deinterlace
-
-Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
----
- drivers/media/platform/Kconfig | 13 +
- drivers/media/platform/sunxi/Makefile | 1 +
- .../media/platform/sunxi/sun50i-di/Makefile | 2 +
- .../platform/sunxi/sun50i-di/sun50i-di.c | 1134 +++++++++++++++++
- .../platform/sunxi/sun50i-di/sun50i-di.h | 172 +++
- 5 files changed, 1322 insertions(+)
- create mode 100644 drivers/media/platform/sunxi/sun50i-di/Makefile
- create mode 100644 drivers/media/platform/sunxi/sun50i-di/sun50i-di.c
- create mode 100644 drivers/media/platform/sunxi/sun50i-di/sun50i-di.h
-
---- a/drivers/media/platform/Kconfig
-+++ b/drivers/media/platform/Kconfig
-@@ -510,6 +510,19 @@ config VIDEO_QCOM_VENUS
- on various Qualcomm SoCs.
- To compile this driver as a module choose m here.
-
-+config VIDEO_SUN50I_DEINTERLACE
-+ tristate "Allwinner Deinterlace v2 driver"
-+ depends on VIDEO_DEV && VIDEO_V4L2
-+ depends on ARCH_SUNXI || COMPILE_TEST
-+ depends on COMMON_CLK && OF
-+ depends on PM
-+ select VIDEOBUF2_DMA_CONTIG
-+ select V4L2_MEM2MEM_DEV
-+ help
-+ Support for the Allwinner deinterlace v2 unit found on
-+ some SoCs, like H6.
-+ To compile this driver as a module choose m here.
-+
- config VIDEO_SUN8I_DEINTERLACE
- tristate "Allwinner Deinterlace driver"
- depends on VIDEO_DEV && VIDEO_V4L2
---- a/drivers/media/platform/sunxi/Makefile
-+++ b/drivers/media/platform/sunxi/Makefile
-@@ -3,4 +3,5 @@
- obj-y += sun4i-csi/
- obj-y += sun6i-csi/
- obj-y += sun8i-di/
-+obj-y += sun50i-di/
- obj-y += sun8i-rotate/
---- /dev/null
-+++ b/drivers/media/platform/sunxi/sun50i-di/Makefile
-@@ -0,0 +1,2 @@
-+# SPDX-License-Identifier: GPL-2.0
-+obj-$(CONFIG_VIDEO_SUN50I_DEINTERLACE) += sun50i-di.o
---- /dev/null
-+++ b/drivers/media/platform/sunxi/sun50i-di/sun50i-di.c
-@@ -0,0 +1,1134 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Allwinner sun50i deinterlacer driver
-+ *
-+ * Copyright (C) 2020 Jernej Skrabec <jernej.skrabec@siol.net>
-+ *
-+ * Based on vim2m driver.
-+ */
-+
-+#include <linux/clk.h>
-+#include <linux/interrupt.h>
-+#include <linux/io.h>
-+#include <linux/iopoll.h>
-+#include <linux/module.h>
-+#include <linux/of.h>
-+#include <linux/of_device.h>
-+#include <linux/pm_runtime.h>
-+#include <linux/reset.h>
-+
-+#include <media/v4l2-device.h>
-+#include <media/v4l2-ioctl.h>
-+#include <media/v4l2-mem2mem.h>
-+
-+#include "sun50i-di.h"
-+
-+#define FLAG_SIZE (DEINTERLACE_MAX_WIDTH * DEINTERLACE_MAX_HEIGHT / 4)
-+
-+static u32 deinterlace_formats[] = {
-+ V4L2_PIX_FMT_NV12,
-+ V4L2_PIX_FMT_NV21,
-+ V4L2_PIX_FMT_YUV420,
-+ V4L2_PIX_FMT_NV16,
-+ V4L2_PIX_FMT_NV61,
-+ V4L2_PIX_FMT_YUV422P
-+};
-+
-+static inline u32 deinterlace_read(struct deinterlace_dev *dev, u32 reg)
-+{
-+ return readl(dev->base + reg);
-+}
-+
-+static inline void deinterlace_write(struct deinterlace_dev *dev,
-+ u32 reg, u32 value)
-+{
-+ writel(value, dev->base + reg);
-+}
-+
-+static inline void deinterlace_set_bits(struct deinterlace_dev *dev,
-+ u32 reg, u32 bits)
-+{
-+ u32 val = readl(dev->base + reg);
-+
-+ val |= bits;
-+
-+ writel(val, dev->base + reg);
-+}
-+
-+static inline void deinterlace_clr_set_bits(struct deinterlace_dev *dev,
-+ u32 reg, u32 clr, u32 set)
-+{
-+ u32 val = readl(dev->base + reg);
-+
-+ val &= ~clr;
-+ val |= set;
-+
-+ writel(val, dev->base + reg);
-+}
-+
-+static void deinterlace_device_run(void *priv)
-+{
-+ u32 width, height, reg, msk, pitch[3], offset[2], fmt;
-+ dma_addr_t buf, prev, curr, next, addr[4][3];
-+ struct deinterlace_ctx *ctx = priv;
-+ struct deinterlace_dev *dev = ctx->dev;
-+ struct vb2_v4l2_buffer *src, *dst;
-+ unsigned int val;
-+ bool motion;
-+
-+ src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
-+ dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
-+
-+ v4l2_m2m_buf_copy_metadata(src, dst, true);
-+
-+ fmt = ctx->src_fmt.pixelformat;
-+
-+ deinterlace_write(dev, DEINTERLACE_IN_FLAG_ADDR, ctx->flag1_buf_dma);
-+ deinterlace_write(dev, DEINTERLACE_OUT_FLAG_ADDR, ctx->flag2_buf_dma);
-+ deinterlace_write(dev, DEINTERLACE_FLAG_ADDRH, 0);
-+ deinterlace_write(dev, DEINTERLACE_FLAG_PITCH, 0x200);
-+
-+ width = ctx->src_fmt.width;
-+ height = ctx->src_fmt.height;
-+
-+ reg = DEINTERLACE_SIZE_WIDTH(width);
-+ reg |= DEINTERLACE_SIZE_HEIGHT(height);
-+ deinterlace_write(dev, DEINTERLACE_SIZE, reg);
-+
-+ switch (fmt) {
-+ case V4L2_PIX_FMT_NV12:
-+ case V4L2_PIX_FMT_NV21:
-+ reg = DEINTERLACE_FORMAT_YUV420SP;
-+ break;
-+ case V4L2_PIX_FMT_YUV420:
-+ reg = DEINTERLACE_FORMAT_YUV420P;
-+ break;
-+ case V4L2_PIX_FMT_NV16:
-+ case V4L2_PIX_FMT_NV61:
-+ reg = DEINTERLACE_FORMAT_YUV422SP;
-+ break;
-+ case V4L2_PIX_FMT_YUV422P:
-+ reg = DEINTERLACE_FORMAT_YUV422P;
-+ break;
-+ }
-+ deinterlace_write(dev, DEINTERLACE_FORMAT, reg);
-+
-+ pitch[0] = ctx->src_fmt.bytesperline;
-+ switch (fmt) {
-+ case V4L2_PIX_FMT_YUV420:
-+ case V4L2_PIX_FMT_YUV422P:
-+ pitch[1] = pitch[0] / 2;
-+ pitch[2] = pitch[1];
-+ break;
-+ case V4L2_PIX_FMT_NV12:
-+ case V4L2_PIX_FMT_NV21:
-+ case V4L2_PIX_FMT_NV16:
-+ case V4L2_PIX_FMT_NV61:
-+ pitch[1] = pitch[0];
-+ pitch[2] = 0;
-+ break;
-+ }
-+
-+ deinterlace_write(dev, DEINTERLACE_IN_PITCH0, pitch[0] * 2);
-+ deinterlace_write(dev, DEINTERLACE_IN_PITCH1, pitch[1] * 2);
-+ deinterlace_write(dev, DEINTERLACE_IN_PITCH2, pitch[2] * 2);
-+ deinterlace_write(dev, DEINTERLACE_OUT_PITCH0, pitch[0]);
-+ deinterlace_write(dev, DEINTERLACE_OUT_PITCH1, pitch[1]);
-+ deinterlace_write(dev, DEINTERLACE_OUT_PITCH2, pitch[2]);
-+
-+ offset[0] = pitch[0] * height;
-+ switch (fmt) {
-+ case V4L2_PIX_FMT_YUV420:
-+ offset[1] = offset[0] + offset[0] / 4;
-+ break;
-+ case V4L2_PIX_FMT_YUV422P:
-+ offset[1] = offset[0] + offset[0] / 2;
-+ break;
-+ default:
-+ offset[1] = 0;
-+ break;
-+ }
-+
-+ buf = vb2_dma_contig_plane_dma_addr(&src->vb2_buf, 0);
-+ next = buf;
-+ if (ctx->prev[0])
-+ buf = vb2_dma_contig_plane_dma_addr(&ctx->prev[0]->vb2_buf, 0);
-+ curr = buf;
-+ if (ctx->prev[1])
-+ buf = vb2_dma_contig_plane_dma_addr(&ctx->prev[1]->vb2_buf, 0);
-+ prev = buf;
-+
-+ if (ctx->first_field == 0) {
-+ if (ctx->field == 0) {
-+ addr[0][0] = prev;
-+ addr[0][1] = prev + offset[0];
-+ addr[0][2] = prev + offset[1];
-+ addr[1][0] = prev + pitch[0];
-+ addr[1][1] = prev + offset[0] + pitch[1];
-+ addr[1][2] = prev + offset[1] + pitch[2];
-+ addr[2][0] = curr;
-+ addr[2][1] = curr + offset[0];
-+ addr[2][2] = curr + offset[1];
-+ addr[3][0] = curr + pitch[0];
-+ addr[3][1] = curr + offset[0] + pitch[1];
-+ addr[3][2] = curr + offset[1] + pitch[2];
-+ } else {
-+ addr[0][0] = prev + pitch[0];
-+ addr[0][1] = prev + offset[0] + pitch[1];
-+ addr[0][2] = prev + offset[1] + pitch[2];
-+ addr[1][0] = curr;
-+ addr[1][1] = curr + offset[0];
-+ addr[1][2] = curr + offset[1];
-+ addr[2][0] = curr + pitch[0];
-+ addr[2][1] = curr + offset[0] + pitch[1];
-+ addr[2][2] = curr + offset[1] + pitch[2];
-+ addr[3][0] = next;
-+ addr[3][1] = next + offset[0];
-+ addr[3][2] = next + offset[1];
-+ }
-+ } else {
-+ if (ctx->field == 0) {
-+ addr[0][0] = prev;
-+ addr[0][1] = prev + offset[0];
-+ addr[0][2] = prev + offset[1];
-+ addr[1][0] = curr + pitch[0];
-+ addr[1][1] = curr + offset[0] + pitch[1];
-+ addr[1][2] = curr + offset[1] + pitch[2];
-+ addr[2][0] = curr;
-+ addr[2][1] = curr + offset[0];
-+ addr[2][2] = curr + offset[1];
-+ addr[3][0] = next + pitch[0];
-+ addr[3][1] = next + offset[0] + pitch[1];
-+ addr[3][2] = next + offset[1] + pitch[2];
-+ } else {
-+ addr[0][0] = prev + pitch[0];
-+ addr[0][1] = prev + offset[0] + pitch[1];
-+ addr[0][2] = prev + offset[1] + pitch[2];
-+ addr[1][0] = prev;
-+ addr[1][1] = prev + offset[0];
-+ addr[1][2] = prev + offset[1];
-+ addr[2][0] = curr + pitch[0];
-+ addr[2][1] = curr + offset[0] + pitch[1];
-+ addr[2][2] = curr + offset[1] + pitch[2];
-+ addr[3][0] = curr;
-+ addr[3][1] = curr + offset[0];
-+ addr[3][2] = curr + offset[1];
-+ }
-+ }
-+
-+ deinterlace_write(dev, DEINTERLACE_IN0_ADDR0, addr[0][0]);
-+ deinterlace_write(dev, DEINTERLACE_IN0_ADDR1, addr[0][1]);
-+ deinterlace_write(dev, DEINTERLACE_IN0_ADDR2, addr[0][2]);
-+
-+ deinterlace_write(dev, DEINTERLACE_IN1_ADDR0, addr[1][0]);
-+ deinterlace_write(dev, DEINTERLACE_IN1_ADDR1, addr[1][1]);
-+ deinterlace_write(dev, DEINTERLACE_IN1_ADDR2, addr[1][2]);
-+
-+ deinterlace_write(dev, DEINTERLACE_IN2_ADDR0, addr[2][0]);
-+ deinterlace_write(dev, DEINTERLACE_IN2_ADDR1, addr[2][1]);
-+ deinterlace_write(dev, DEINTERLACE_IN2_ADDR2, addr[2][2]);
-+
-+ deinterlace_write(dev, DEINTERLACE_IN3_ADDR0, addr[3][0]);
-+ deinterlace_write(dev, DEINTERLACE_IN3_ADDR1, addr[3][1]);
-+ deinterlace_write(dev, DEINTERLACE_IN3_ADDR2, addr[3][2]);
-+
-+ buf = vb2_dma_contig_plane_dma_addr(&dst->vb2_buf, 0);
-+ deinterlace_write(dev, DEINTERLACE_OUT_ADDR0, buf);
-+ deinterlace_write(dev, DEINTERLACE_OUT_ADDR1, buf + offset[0]);
-+ deinterlace_write(dev, DEINTERLACE_OUT_ADDR2, buf + offset[1]);
-+
-+ if (ctx->first_field == 0)
-+ val = 4;
-+ else
-+ val = 5;
-+
-+ reg = DEINTERLACE_INTP_PARAM0_LUMA_CUR_FAC_MODE(val);
-+ reg |= DEINTERLACE_INTP_PARAM0_CHROMA_CUR_FAC_MODE(val);
-+ msk = DEINTERLACE_INTP_PARAM0_LUMA_CUR_FAC_MODE_MSK;
-+ msk |= DEINTERLACE_INTP_PARAM0_CHROMA_CUR_FAC_MODE_MSK;
-+ deinterlace_clr_set_bits(dev, DEINTERLACE_INTP_PARAM0, msk, reg);
-+
-+ reg = DEINTERLACE_POLAR_FIELD(ctx->field);
-+ deinterlace_write(dev, DEINTERLACE_POLAR, reg);
-+
-+ motion = ctx->prev[0] && ctx->prev[1];
-+ reg = DEINTERLACE_MODE_DEINT_LUMA;
-+ if (motion)
-+ reg |= DEINTERLACE_MODE_MOTION_EN;
-+ reg |= DEINTERLACE_MODE_INTP_EN;
-+ reg |= DEINTERLACE_MODE_AUTO_UPD_MODE(ctx->first_field);
-+ reg |= DEINTERLACE_MODE_DEINT_CHROMA;
-+ if (!motion)
-+ reg |= DEINTERLACE_MODE_FIELD_MODE;
-+ deinterlace_write(dev, DEINTERLACE_MODE, reg);
-+
-+ deinterlace_set_bits(dev, DEINTERLACE_INT_CTRL,
-+ DEINTERLACE_INT_EN);
-+
-+ deinterlace_set_bits(dev, DEINTERLACE_CTRL,
-+ DEINTERLACE_CTRL_START);
-+}
-+
-+static int deinterlace_job_ready(void *priv)
-+{
-+ struct deinterlace_ctx *ctx = priv;
-+
-+ return v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) >= 1 &&
-+ v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx) >= 2;
-+}
-+
-+static void deinterlace_job_abort(void *priv)
-+{
-+ struct deinterlace_ctx *ctx = priv;
-+
-+ /* Will cancel the transaction in the next interrupt handler */
-+ ctx->aborting = 1;
-+}
-+
-+static irqreturn_t deinterlace_irq(int irq, void *data)
-+{
-+ struct deinterlace_dev *dev = data;
-+ struct vb2_v4l2_buffer *src, *dst;
-+ struct deinterlace_ctx *ctx;
-+ unsigned int val;
-+
-+ ctx = v4l2_m2m_get_curr_priv(dev->m2m_dev);
-+ if (!ctx) {
-+ v4l2_err(&dev->v4l2_dev,
-+ "Instance released before the end of transaction\n");
-+ return IRQ_NONE;
-+ }
-+
-+ val = deinterlace_read(dev, DEINTERLACE_STATUS);
-+ if (!(val & DEINTERLACE_STATUS_FINISHED))
-+ return IRQ_NONE;
-+
-+ deinterlace_write(dev, DEINTERLACE_INT_CTRL, 0);
-+ deinterlace_set_bits(dev, DEINTERLACE_STATUS,
-+ DEINTERLACE_STATUS_FINISHED);
-+ deinterlace_clr_set_bits(dev, DEINTERLACE_CTRL,
-+ DEINTERLACE_CTRL_START, 0);
-+
-+ dst = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
-+ v4l2_m2m_buf_done(dst, VB2_BUF_STATE_DONE);
-+
-+ if (ctx->field != ctx->first_field || ctx->aborting) {
-+ ctx->field = ctx->first_field;
-+
-+ src = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
-+ if (ctx->prev[1])
-+ v4l2_m2m_buf_done(ctx->prev[1], VB2_BUF_STATE_DONE);
-+ ctx->prev[1] = ctx->prev[0];
-+ ctx->prev[0] = src;
-+
-+ v4l2_m2m_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx);
-+ } else {
-+ ctx->field = !ctx->first_field;
-+ deinterlace_device_run(ctx);
-+ }
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static void deinterlace_init(struct deinterlace_dev *dev)
-+{
-+ u32 reg;
-+
-+ deinterlace_write(dev, DEINTERLACE_OUT_PATH, 0);
-+
-+ reg = DEINTERLACE_MD_PARAM0_MIN_LUMA_TH(4);
-+ reg |= DEINTERLACE_MD_PARAM0_MAX_LUMA_TH(12);
-+ reg |= DEINTERLACE_MD_PARAM0_AVG_LUMA_SHIFT(6);
-+ reg |= DEINTERLACE_MD_PARAM0_TH_SHIFT(1);
-+ deinterlace_write(dev, DEINTERLACE_MD_PARAM0, reg);
-+
-+ reg = DEINTERLACE_MD_PARAM1_MOV_FAC_NONEDGE(2);
-+ deinterlace_write(dev, DEINTERLACE_MD_PARAM1, reg);
-+
-+ reg = DEINTERLACE_MD_PARAM2_CHROMA_SPATIAL_TH(128);
-+ reg |= DEINTERLACE_MD_PARAM2_CHROMA_DIFF_TH(5);
-+ reg |= DEINTERLACE_MD_PARAM2_PIX_STATIC_TH(3);
-+ deinterlace_write(dev, DEINTERLACE_MD_PARAM2, reg);
-+
-+ reg = DEINTERLACE_INTP_PARAM0_ANGLE_LIMIT(20);
-+ reg |= DEINTERLACE_INTP_PARAM0_ANGLE_CONST_TH(5);
-+ reg |= DEINTERLACE_INTP_PARAM0_LUMA_CUR_FAC_MODE(1);
-+ reg |= DEINTERLACE_INTP_PARAM0_CHROMA_CUR_FAC_MODE(1);
-+ deinterlace_write(dev, DEINTERLACE_INTP_PARAM0, reg);
-+
-+ reg = DEINTERLACE_MD_CH_PARAM_BLEND_MODE(1);
-+ reg |= DEINTERLACE_MD_CH_PARAM_FONT_PRO_EN;
-+ reg |= DEINTERLACE_MD_CH_PARAM_FONT_PRO_TH(48);
-+ reg |= DEINTERLACE_MD_CH_PARAM_FONT_PRO_FAC(4);
-+ deinterlace_write(dev, DEINTERLACE_MD_CH_PARAM, reg);
-+
-+ reg = DEINTERLACE_INTP_PARAM1_A(4);
-+ reg |= DEINTERLACE_INTP_PARAM1_EN;
-+ reg |= DEINTERLACE_INTP_PARAM1_C(10);
-+ reg |= DEINTERLACE_INTP_PARAM1_CMAX(64);
-+ reg |= DEINTERLACE_INTP_PARAM1_MAXRAT(2);
-+ deinterlace_write(dev, DEINTERLACE_INTP_PARAM1, reg);
-+
-+ /* only 32-bit addresses are supported, so high bits are always 0 */
-+ deinterlace_write(dev, DEINTERLACE_IN0_ADDRH, 0);
-+ deinterlace_write(dev, DEINTERLACE_IN1_ADDRH, 0);
-+ deinterlace_write(dev, DEINTERLACE_IN2_ADDRH, 0);
-+ deinterlace_write(dev, DEINTERLACE_IN3_ADDRH, 0);
-+ deinterlace_write(dev, DEINTERLACE_OUT_ADDRH, 0);
-+}
-+
-+static inline struct deinterlace_ctx *deinterlace_file2ctx(struct file *file)
-+{
-+ return container_of(file->private_data, struct deinterlace_ctx, fh);
-+}
-+
-+static bool deinterlace_check_format(u32 pixelformat)
-+{
-+ unsigned int i;
-+
-+ for (i = 0; i < ARRAY_SIZE(deinterlace_formats); i++)
-+ if (deinterlace_formats[i] == pixelformat)
-+ return true;
-+
-+ return false;
-+}
-+
-+static void deinterlace_prepare_format(struct v4l2_pix_format *pix_fmt)
-+{
-+ unsigned int bytesperline = pix_fmt->bytesperline;
-+ unsigned int height = pix_fmt->height;
-+ unsigned int width = pix_fmt->width;
-+ unsigned int sizeimage;
-+
-+ width = clamp(width, DEINTERLACE_MIN_WIDTH,
-+ DEINTERLACE_MAX_WIDTH);
-+ height = clamp(height, DEINTERLACE_MIN_HEIGHT,
-+ DEINTERLACE_MAX_HEIGHT);
-+
-+ /* try to respect userspace wishes about pitch */
-+ bytesperline = ALIGN(bytesperline, 2);
-+ if (bytesperline < ALIGN(width, 2))
-+ bytesperline = ALIGN(width, 2);
-+
-+ /* luma */
-+ sizeimage = bytesperline * height;
-+ /* chroma */
-+ switch (pix_fmt->pixelformat) {
-+ case V4L2_PIX_FMT_NV12:
-+ case V4L2_PIX_FMT_NV21:
-+ case V4L2_PIX_FMT_YUV420:
-+ sizeimage += bytesperline * height / 2;
-+ break;
-+ case V4L2_PIX_FMT_NV16:
-+ case V4L2_PIX_FMT_NV61:
-+ case V4L2_PIX_FMT_YUV422P:
-+ sizeimage += bytesperline * height;
-+ break;
-+ }
-+
-+ if (pix_fmt->sizeimage < sizeimage)
-+ pix_fmt->sizeimage = sizeimage;
-+
-+ pix_fmt->width = width;
-+ pix_fmt->height = height;
-+ pix_fmt->bytesperline = bytesperline;
-+}
-+
-+static int deinterlace_querycap(struct file *file, void *priv,
-+ struct v4l2_capability *cap)
-+{
-+ strscpy(cap->driver, DEINTERLACE_NAME, sizeof(cap->driver));
-+ strscpy(cap->card, DEINTERLACE_NAME, sizeof(cap->card));
-+ snprintf(cap->bus_info, sizeof(cap->bus_info),
-+ "platform:%s", DEINTERLACE_NAME);
-+
-+ return 0;
-+}
-+
-+static int deinterlace_enum_fmt(struct file *file, void *priv,
-+ struct v4l2_fmtdesc *f)
-+{
-+ if (f->index < ARRAY_SIZE(deinterlace_formats)) {
-+ f->pixelformat = deinterlace_formats[f->index];
-+
-+ return 0;
-+ }
-+
-+ return -EINVAL;
-+}
-+
-+static int deinterlace_enum_framesizes(struct file *file, void *priv,
-+ struct v4l2_frmsizeenum *fsize)
-+{
-+ if (fsize->index != 0)
-+ return -EINVAL;
-+
-+ if (!deinterlace_check_format(fsize->pixel_format))
-+ return -EINVAL;
-+
-+ fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
-+ fsize->stepwise.min_width = DEINTERLACE_MIN_WIDTH;
-+ fsize->stepwise.min_height = DEINTERLACE_MIN_HEIGHT;
-+ fsize->stepwise.max_width = DEINTERLACE_MAX_WIDTH;
-+ fsize->stepwise.max_height = DEINTERLACE_MAX_HEIGHT;
-+ fsize->stepwise.step_width = 2;
-+
-+ switch (fsize->pixel_format) {
-+ case V4L2_PIX_FMT_NV12:
-+ case V4L2_PIX_FMT_NV21:
-+ case V4L2_PIX_FMT_YUV420:
-+ fsize->stepwise.step_height = 2;
-+ break;
-+ case V4L2_PIX_FMT_NV16:
-+ case V4L2_PIX_FMT_NV61:
-+ case V4L2_PIX_FMT_YUV422P:
-+ fsize->stepwise.step_height = 1;
-+ break;
-+ }
-+
-+ return 0;
-+}
-+
-+static int deinterlace_set_cap_format(struct deinterlace_ctx *ctx,
-+ struct v4l2_pix_format *f)
-+{
-+ if (!deinterlace_check_format(ctx->src_fmt.pixelformat))
-+ return -EINVAL;
-+
-+ f->pixelformat = ctx->src_fmt.pixelformat;
-+ f->field = V4L2_FIELD_NONE;
-+ f->width = ctx->src_fmt.width;
-+ f->height = ctx->src_fmt.height;
-+
-+ deinterlace_prepare_format(f);
-+
-+ return 0;
-+}
-+
-+static int deinterlace_g_fmt_vid_cap(struct file *file, void *priv,
-+ struct v4l2_format *f)
-+{
-+ struct deinterlace_ctx *ctx = deinterlace_file2ctx(file);
-+
-+ f->fmt.pix = ctx->dst_fmt;
-+
-+ return 0;
-+}
-+
-+static int deinterlace_g_fmt_vid_out(struct file *file, void *priv,
-+ struct v4l2_format *f)
-+{
-+ struct deinterlace_ctx *ctx = deinterlace_file2ctx(file);
-+
-+ f->fmt.pix = ctx->src_fmt;
-+
-+ return 0;
-+}
-+
-+static int deinterlace_try_fmt_vid_cap(struct file *file, void *priv,
-+ struct v4l2_format *f)
-+{
-+ struct deinterlace_ctx *ctx = deinterlace_file2ctx(file);
-+
-+ return deinterlace_set_cap_format(ctx, &f->fmt.pix);
-+}
-+
-+static int deinterlace_try_fmt_vid_out(struct file *file, void *priv,
-+ struct v4l2_format *f)
-+{
-+ if (!deinterlace_check_format(f->fmt.pix.pixelformat))
-+ f->fmt.pix.pixelformat = deinterlace_formats[0];
-+
-+ if (f->fmt.pix.field != V4L2_FIELD_INTERLACED_TB &&
-+ f->fmt.pix.field != V4L2_FIELD_INTERLACED_BT &&
-+ f->fmt.pix.field != V4L2_FIELD_INTERLACED)
-+ f->fmt.pix.field = V4L2_FIELD_INTERLACED;
-+
-+ deinterlace_prepare_format(&f->fmt.pix);
-+
-+ return 0;
-+}
-+
-+static int deinterlace_s_fmt_vid_cap(struct file *file, void *priv,
-+ struct v4l2_format *f)
-+{
-+ struct deinterlace_ctx *ctx = deinterlace_file2ctx(file);
-+ struct vb2_queue *vq;
-+ int ret;
-+
-+ ret = deinterlace_try_fmt_vid_cap(file, priv, f);
-+ if (ret)
-+ return ret;
-+
-+ vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
-+ if (vb2_is_busy(vq))
-+ return -EBUSY;
-+
-+ ctx->dst_fmt = f->fmt.pix;
-+
-+ return 0;
-+}
-+
-+static int deinterlace_s_fmt_vid_out(struct file *file, void *priv,
-+ struct v4l2_format *f)
-+{
-+ struct deinterlace_ctx *ctx = deinterlace_file2ctx(file);
-+ struct vb2_queue *vq;
-+ int ret;
-+
-+ ret = deinterlace_try_fmt_vid_out(file, priv, f);
-+ if (ret)
-+ return ret;
-+
-+ vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
-+ if (vb2_is_busy(vq))
-+ return -EBUSY;
-+
-+ /*
-+ * Capture queue has to be also checked, because format and size
-+ * depends on output format and size.
-+ */
-+ vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
-+ if (vb2_is_busy(vq))
-+ return -EBUSY;
-+
-+ ctx->src_fmt = f->fmt.pix;
-+
-+ /* Propagate colorspace information to capture. */
-+ ctx->dst_fmt.colorspace = f->fmt.pix.colorspace;
-+ ctx->dst_fmt.xfer_func = f->fmt.pix.xfer_func;
-+ ctx->dst_fmt.ycbcr_enc = f->fmt.pix.ycbcr_enc;
-+ ctx->dst_fmt.quantization = f->fmt.pix.quantization;
-+
-+ return deinterlace_set_cap_format(ctx, &ctx->dst_fmt);
-+}
-+
-+static const struct v4l2_ioctl_ops deinterlace_ioctl_ops = {
-+ .vidioc_querycap = deinterlace_querycap,
-+
-+ .vidioc_enum_framesizes = deinterlace_enum_framesizes,
-+
-+ .vidioc_enum_fmt_vid_cap = deinterlace_enum_fmt,
-+ .vidioc_g_fmt_vid_cap = deinterlace_g_fmt_vid_cap,
-+ .vidioc_try_fmt_vid_cap = deinterlace_try_fmt_vid_cap,
-+ .vidioc_s_fmt_vid_cap = deinterlace_s_fmt_vid_cap,
-+
-+ .vidioc_enum_fmt_vid_out = deinterlace_enum_fmt,
-+ .vidioc_g_fmt_vid_out = deinterlace_g_fmt_vid_out,
-+ .vidioc_try_fmt_vid_out = deinterlace_try_fmt_vid_out,
-+ .vidioc_s_fmt_vid_out = deinterlace_s_fmt_vid_out,
-+
-+ .vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs,
-+ .vidioc_querybuf = v4l2_m2m_ioctl_querybuf,
-+ .vidioc_qbuf = v4l2_m2m_ioctl_qbuf,
-+ .vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf,
-+ .vidioc_prepare_buf = v4l2_m2m_ioctl_prepare_buf,
-+ .vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs,
-+ .vidioc_expbuf = v4l2_m2m_ioctl_expbuf,
-+
-+ .vidioc_streamon = v4l2_m2m_ioctl_streamon,
-+ .vidioc_streamoff = v4l2_m2m_ioctl_streamoff,
-+};
-+
-+static int deinterlace_queue_setup(struct vb2_queue *vq, unsigned int *nbuffers,
-+ unsigned int *nplanes, unsigned int sizes[],
-+ struct device *alloc_devs[])
-+{
-+ struct deinterlace_ctx *ctx = vb2_get_drv_priv(vq);
-+ struct v4l2_pix_format *pix_fmt;
-+
-+ if (V4L2_TYPE_IS_OUTPUT(vq->type))
-+ pix_fmt = &ctx->src_fmt;
-+ else
-+ pix_fmt = &ctx->dst_fmt;
-+
-+ if (*nplanes) {
-+ if (sizes[0] < pix_fmt->sizeimage)
-+ return -EINVAL;
-+ } else {
-+ sizes[0] = pix_fmt->sizeimage;
-+ *nplanes = 1;
-+ }
-+
-+ return 0;
-+}
-+
-+static int deinterlace_buf_prepare(struct vb2_buffer *vb)
-+{
-+ struct vb2_queue *vq = vb->vb2_queue;
-+ struct deinterlace_ctx *ctx = vb2_get_drv_priv(vq);
-+ struct v4l2_pix_format *pix_fmt;
-+
-+ if (V4L2_TYPE_IS_OUTPUT(vq->type))
-+ pix_fmt = &ctx->src_fmt;
-+ else
-+ pix_fmt = &ctx->dst_fmt;
-+
-+ if (vb2_plane_size(vb, 0) < pix_fmt->sizeimage)
-+ return -EINVAL;
-+
-+ vb2_set_plane_payload(vb, 0, pix_fmt->sizeimage);
-+
-+ return 0;
-+}
-+
-+static void deinterlace_buf_queue(struct vb2_buffer *vb)
-+{
-+ struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
-+ struct deinterlace_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
-+
-+ v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
-+}
-+
-+static void deinterlace_queue_cleanup(struct vb2_queue *vq, u32 state)
-+{
-+ struct deinterlace_ctx *ctx = vb2_get_drv_priv(vq);
-+ struct vb2_v4l2_buffer *vbuf;
-+
-+ do {
-+ if (V4L2_TYPE_IS_OUTPUT(vq->type))
-+ vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
-+ else
-+ vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
-+
-+ if (vbuf)
-+ v4l2_m2m_buf_done(vbuf, state);
-+ } while (vbuf);
-+
-+ if (V4L2_TYPE_IS_OUTPUT(vq->type)) {
-+ if (ctx->prev[0])
-+ v4l2_m2m_buf_done(ctx->prev[0], state);
-+ if (ctx->prev[1])
-+ v4l2_m2m_buf_done(ctx->prev[1], state);
-+ }
-+}
-+
-+static int deinterlace_start_streaming(struct vb2_queue *vq, unsigned int count)
-+{
-+ struct deinterlace_ctx *ctx = vb2_get_drv_priv(vq);
-+ struct device *dev = ctx->dev->dev;
-+ int ret;
-+
-+ if (V4L2_TYPE_IS_OUTPUT(vq->type)) {
-+ ret = pm_runtime_get_sync(dev);
-+ if (ret < 0) {
-+ dev_err(dev, "Failed to enable module\n");
-+
-+ goto err_runtime_get;
-+ }
-+
-+ ctx->first_field =
-+ ctx->src_fmt.field == V4L2_FIELD_INTERLACED_BT;
-+ ctx->field = ctx->first_field;
-+
-+ ctx->prev[0] = NULL;
-+ ctx->prev[1] = NULL;
-+ ctx->aborting = 0;
-+
-+ ctx->flag1_buf = dma_alloc_coherent(dev, FLAG_SIZE,
-+ &ctx->flag1_buf_dma,
-+ GFP_KERNEL);
-+ if (!ctx->flag1_buf) {
-+ ret = -ENOMEM;
-+
-+ goto err_no_mem1;
-+ }
-+
-+ ctx->flag2_buf = dma_alloc_coherent(dev, FLAG_SIZE,
-+ &ctx->flag2_buf_dma,
-+ GFP_KERNEL);
-+ if (!ctx->flag2_buf) {
-+ ret = -ENOMEM;
-+
-+ goto err_no_mem2;
-+ }
-+ }
-+
-+ return 0;
-+
-+err_no_mem2:
-+ dma_free_coherent(dev, FLAG_SIZE, ctx->flag1_buf,
-+ ctx->flag1_buf_dma);
-+err_no_mem1:
-+ pm_runtime_put(dev);
-+err_runtime_get:
-+ deinterlace_queue_cleanup(vq, VB2_BUF_STATE_QUEUED);
-+
-+ return ret;
-+}
-+
-+static void deinterlace_stop_streaming(struct vb2_queue *vq)
-+{
-+ struct deinterlace_ctx *ctx = vb2_get_drv_priv(vq);
-+
-+ if (V4L2_TYPE_IS_OUTPUT(vq->type)) {
-+ struct device *dev = ctx->dev->dev;
-+
-+ dma_free_coherent(dev, FLAG_SIZE, ctx->flag1_buf,
-+ ctx->flag1_buf_dma);
-+ dma_free_coherent(dev, FLAG_SIZE, ctx->flag2_buf,
-+ ctx->flag2_buf_dma);
-+
-+ pm_runtime_put(dev);
-+ }
-+
-+ deinterlace_queue_cleanup(vq, VB2_BUF_STATE_ERROR);
-+}
-+
-+static const struct vb2_ops deinterlace_qops = {
-+ .queue_setup = deinterlace_queue_setup,
-+ .buf_prepare = deinterlace_buf_prepare,
-+ .buf_queue = deinterlace_buf_queue,
-+ .start_streaming = deinterlace_start_streaming,
-+ .stop_streaming = deinterlace_stop_streaming,
-+ .wait_prepare = vb2_ops_wait_prepare,
-+ .wait_finish = vb2_ops_wait_finish,
-+};
-+
-+static int deinterlace_queue_init(void *priv, struct vb2_queue *src_vq,
-+ struct vb2_queue *dst_vq)
-+{
-+ struct deinterlace_ctx *ctx = priv;
-+ int ret;
-+
-+ src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
-+ src_vq->io_modes = VB2_MMAP | VB2_DMABUF;
-+ src_vq->drv_priv = ctx;
-+ src_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
-+ src_vq->min_buffers_needed = 1;
-+ src_vq->ops = &deinterlace_qops;
-+ src_vq->mem_ops = &vb2_dma_contig_memops;
-+ src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
-+ src_vq->lock = &ctx->dev->dev_mutex;
-+ src_vq->dev = ctx->dev->dev;
-+
-+ ret = vb2_queue_init(src_vq);
-+ if (ret)
-+ return ret;
-+
-+ dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-+ dst_vq->io_modes = VB2_MMAP | VB2_DMABUF;
-+ dst_vq->drv_priv = ctx;
-+ dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
-+ dst_vq->min_buffers_needed = 2;
-+ dst_vq->ops = &deinterlace_qops;
-+ dst_vq->mem_ops = &vb2_dma_contig_memops;
-+ dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
-+ dst_vq->lock = &ctx->dev->dev_mutex;
-+ dst_vq->dev = ctx->dev->dev;
-+
-+ ret = vb2_queue_init(dst_vq);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int deinterlace_open(struct file *file)
-+{
-+ struct deinterlace_dev *dev = video_drvdata(file);
-+ struct deinterlace_ctx *ctx = NULL;
-+ int ret;
-+
-+ if (mutex_lock_interruptible(&dev->dev_mutex))
-+ return -ERESTARTSYS;
-+
-+ ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
-+ if (!ctx) {
-+ mutex_unlock(&dev->dev_mutex);
-+ return -ENOMEM;
-+ }
-+
-+ /* default output format */
-+ ctx->src_fmt.pixelformat = deinterlace_formats[0];
-+ ctx->src_fmt.field = V4L2_FIELD_INTERLACED;
-+ ctx->src_fmt.width = 640;
-+ ctx->src_fmt.height = 480;
-+ deinterlace_prepare_format(&ctx->src_fmt);
-+
-+ /* default capture format */
-+ ctx->dst_fmt.pixelformat = deinterlace_formats[0];
-+ ctx->dst_fmt.field = V4L2_FIELD_NONE;
-+ ctx->dst_fmt.width = 640;
-+ ctx->dst_fmt.height = 480;
-+ deinterlace_prepare_format(&ctx->dst_fmt);
-+
-+ v4l2_fh_init(&ctx->fh, video_devdata(file));
-+ file->private_data = &ctx->fh;
-+ ctx->dev = dev;
-+
-+ ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev, ctx,
-+ &deinterlace_queue_init);
-+ if (IS_ERR(ctx->fh.m2m_ctx)) {
-+ ret = PTR_ERR(ctx->fh.m2m_ctx);
-+ goto err_free;
-+ }
-+
-+ v4l2_fh_add(&ctx->fh);
-+
-+ mutex_unlock(&dev->dev_mutex);
-+
-+ return 0;
-+
-+err_free:
-+ kfree(ctx);
-+ mutex_unlock(&dev->dev_mutex);
-+
-+ return ret;
-+}
-+
-+static int deinterlace_release(struct file *file)
-+{
-+ struct deinterlace_dev *dev = video_drvdata(file);
-+ struct deinterlace_ctx *ctx = container_of(file->private_data,
-+ struct deinterlace_ctx, fh);
-+
-+ mutex_lock(&dev->dev_mutex);
-+
-+ v4l2_fh_del(&ctx->fh);
-+ v4l2_fh_exit(&ctx->fh);
-+ v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
-+
-+ kfree(ctx);
-+
-+ mutex_unlock(&dev->dev_mutex);
-+
-+ return 0;
-+}
-+
-+static const struct v4l2_file_operations deinterlace_fops = {
-+ .owner = THIS_MODULE,
-+ .open = deinterlace_open,
-+ .release = deinterlace_release,
-+ .poll = v4l2_m2m_fop_poll,
-+ .unlocked_ioctl = video_ioctl2,
-+ .mmap = v4l2_m2m_fop_mmap,
-+};
-+
-+static const struct video_device deinterlace_video_device = {
-+ .name = DEINTERLACE_NAME,
-+ .vfl_dir = VFL_DIR_M2M,
-+ .fops = &deinterlace_fops,
-+ .ioctl_ops = &deinterlace_ioctl_ops,
-+ .minor = -1,
-+ .release = video_device_release_empty,
-+ .device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING,
-+};
-+
-+static const struct v4l2_m2m_ops deinterlace_m2m_ops = {
-+ .device_run = deinterlace_device_run,
-+ .job_ready = deinterlace_job_ready,
-+ .job_abort = deinterlace_job_abort,
-+};
-+
-+static int deinterlace_probe(struct platform_device *pdev)
-+{
-+ struct deinterlace_dev *dev;
-+ struct video_device *vfd;
-+ struct resource *res;
-+ int irq, ret;
-+
-+ dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
-+ if (!dev)
-+ return -ENOMEM;
-+
-+ dev->vfd = deinterlace_video_device;
-+ dev->dev = &pdev->dev;
-+
-+ irq = platform_get_irq(pdev, 0);
-+ if (irq <= 0)
-+ return irq;
-+
-+ ret = devm_request_irq(dev->dev, irq, deinterlace_irq,
-+ 0, dev_name(dev->dev), dev);
-+ if (ret) {
-+ dev_err(dev->dev, "Failed to request IRQ\n");
-+
-+ return ret;
-+ }
-+
-+ ret = of_dma_configure(dev->dev, dev->dev->of_node, true);
-+ if (ret)
-+ return ret;
-+
-+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ dev->base = devm_ioremap_resource(&pdev->dev, res);
-+ if (IS_ERR(dev->base))
-+ return PTR_ERR(dev->base);
-+
-+ dev->bus_clk = devm_clk_get(dev->dev, "bus");
-+ if (IS_ERR(dev->bus_clk)) {
-+ dev_err(dev->dev, "Failed to get bus clock\n");
-+
-+ return PTR_ERR(dev->bus_clk);
-+ }
-+
-+ dev->mod_clk = devm_clk_get(dev->dev, "mod");
-+ if (IS_ERR(dev->mod_clk)) {
-+ dev_err(dev->dev, "Failed to get mod clock\n");
-+
-+ return PTR_ERR(dev->mod_clk);
-+ }
-+
-+ dev->ram_clk = devm_clk_get(dev->dev, "ram");
-+ if (IS_ERR(dev->ram_clk)) {
-+ dev_err(dev->dev, "Failed to get ram clock\n");
-+
-+ return PTR_ERR(dev->ram_clk);
-+ }
-+
-+ dev->rstc = devm_reset_control_get(dev->dev, NULL);
-+ if (IS_ERR(dev->rstc)) {
-+ dev_err(dev->dev, "Failed to get reset control\n");
-+
-+ return PTR_ERR(dev->rstc);
-+ }
-+
-+ mutex_init(&dev->dev_mutex);
-+
-+ ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
-+ if (ret) {
-+ dev_err(dev->dev, "Failed to register V4L2 device\n");
-+
-+ return ret;
-+ }
-+
-+ vfd = &dev->vfd;
-+ vfd->lock = &dev->dev_mutex;
-+ vfd->v4l2_dev = &dev->v4l2_dev;
-+
-+ snprintf(vfd->name, sizeof(vfd->name), "%s",
-+ deinterlace_video_device.name);
-+ video_set_drvdata(vfd, dev);
-+
-+ ret = video_register_device(vfd, VFL_TYPE_VIDEO, 0);
-+ if (ret) {
-+ v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
-+
-+ goto err_v4l2;
-+ }
-+
-+ v4l2_info(&dev->v4l2_dev,
-+ "Device registered as /dev/video%d\n", vfd->num);
-+
-+ dev->m2m_dev = v4l2_m2m_init(&deinterlace_m2m_ops);
-+ if (IS_ERR(dev->m2m_dev)) {
-+ v4l2_err(&dev->v4l2_dev,
-+ "Failed to initialize V4L2 M2M device\n");
-+ ret = PTR_ERR(dev->m2m_dev);
-+
-+ goto err_video;
-+ }
-+
-+ platform_set_drvdata(pdev, dev);
-+
-+ pm_runtime_enable(dev->dev);
-+
-+ return 0;
-+
-+err_video:
-+ video_unregister_device(&dev->vfd);
-+err_v4l2:
-+ v4l2_device_unregister(&dev->v4l2_dev);
-+
-+ return ret;
-+}
-+
-+static int deinterlace_remove(struct platform_device *pdev)
-+{
-+ struct deinterlace_dev *dev = platform_get_drvdata(pdev);
-+
-+ v4l2_m2m_release(dev->m2m_dev);
-+ video_unregister_device(&dev->vfd);
-+ v4l2_device_unregister(&dev->v4l2_dev);
-+
-+ pm_runtime_force_suspend(&pdev->dev);
-+
-+ return 0;
-+}
-+
-+static int deinterlace_runtime_resume(struct device *device)
-+{
-+ struct deinterlace_dev *dev = dev_get_drvdata(device);
-+ int ret;
-+
-+ ret = clk_prepare_enable(dev->bus_clk);
-+ if (ret) {
-+ dev_err(dev->dev, "Failed to enable bus clock\n");
-+
-+ return ret;
-+ }
-+
-+ ret = clk_prepare_enable(dev->mod_clk);
-+ if (ret) {
-+ dev_err(dev->dev, "Failed to enable mod clock\n");
-+
-+ goto err_bus_clk;
-+ }
-+
-+ ret = clk_prepare_enable(dev->ram_clk);
-+ if (ret) {
-+ dev_err(dev->dev, "Failed to enable ram clock\n");
-+
-+ goto err_mod_clk;
-+ }
-+
-+ ret = reset_control_deassert(dev->rstc);
-+ if (ret) {
-+ dev_err(dev->dev, "Failed to apply reset\n");
-+
-+ goto err_ram_clk;
-+ }
-+
-+ deinterlace_init(dev);
-+
-+ return 0;
-+
-+err_ram_clk:
-+ clk_disable_unprepare(dev->ram_clk);
-+err_mod_clk:
-+ clk_disable_unprepare(dev->mod_clk);
-+err_bus_clk:
-+ clk_disable_unprepare(dev->bus_clk);
-+
-+ return ret;
-+}
-+
-+static int deinterlace_runtime_suspend(struct device *device)
-+{
-+ struct deinterlace_dev *dev = dev_get_drvdata(device);
-+
-+ reset_control_assert(dev->rstc);
-+
-+ clk_disable_unprepare(dev->ram_clk);
-+ clk_disable_unprepare(dev->mod_clk);
-+ clk_disable_unprepare(dev->bus_clk);
-+
-+ return 0;
-+}
-+
-+static const struct of_device_id deinterlace_dt_match[] = {
-+ { .compatible = "allwinner,sun50i-h6-deinterlace" },
-+ { /* sentinel */ }
-+};
-+MODULE_DEVICE_TABLE(of, deinterlace_dt_match);
-+
-+static const struct dev_pm_ops deinterlace_pm_ops = {
-+ .runtime_resume = deinterlace_runtime_resume,
-+ .runtime_suspend = deinterlace_runtime_suspend,
-+};
-+
-+static struct platform_driver deinterlace_driver = {
-+ .probe = deinterlace_probe,
-+ .remove = deinterlace_remove,
-+ .driver = {
-+ .name = DEINTERLACE_NAME,
-+ .of_match_table = deinterlace_dt_match,
-+ .pm = &deinterlace_pm_ops,
-+ },
-+};
-+module_platform_driver(deinterlace_driver);
-+
-+MODULE_LICENSE("GPL v2");
-+MODULE_AUTHOR("Jernej Skrabec <jernej.skrabec@siol.net>");
-+MODULE_DESCRIPTION("Allwinner Deinterlace driver");
---- /dev/null
-+++ b/drivers/media/platform/sunxi/sun50i-di/sun50i-di.h
-@@ -0,0 +1,172 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Allwinner Deinterlace driver
-+ *
-+ * Copyright (C) 2020 Jernej Skrabec <jernej.skrabec@siol.net>
-+ */
-+
-+#ifndef _SUN8I_DEINTERLACE_H_
-+#define _SUN8I_DEINTERLACE_H_
-+
-+#include <media/v4l2-device.h>
-+#include <media/v4l2-mem2mem.h>
-+#include <media/videobuf2-v4l2.h>
-+#include <media/videobuf2-dma-contig.h>
-+
-+#include <linux/platform_device.h>
-+
-+#define DEINTERLACE_NAME "sun50i-di"
-+
-+#define DEINTERLACE_CTRL 0x00
-+#define DEINTERLACE_CTRL_START BIT(0)
-+#define DEINTERLACE_CTRL_IOMMU_EN BIT(16)
-+#define DEINTERLACE_CTRL_RESET BIT(31)
-+
-+#define DEINTERLACE_INT_CTRL 0x04
-+#define DEINTERLACE_INT_EN BIT(0)
-+
-+#define DEINTERLACE_STATUS 0x08
-+#define DEINTERLACE_STATUS_FINISHED BIT(0)
-+#define DEINTERLACE_STATUS_BUSY BIT(8)
-+
-+#define DEINTERLACE_SIZE 0x10
-+#define DEINTERLACE_SIZE_WIDTH(w) \
-+ (((w) - 1) & 0x7ff)
-+#define DEINTERLACE_SIZE_HEIGHT(h) \
-+ ((((h) - 1) & 0x7ff) << 16)
-+
-+#define DEINTERLACE_FORMAT 0x14
-+#define DEINTERLACE_FORMAT_YUV420P 0
-+#define DEINTERLACE_FORMAT_YUV420SP 1
-+#define DEINTERLACE_FORMAT_YUV422P 2
-+#define DEINTERLACE_FORMAT_YUV422SP 3
-+
-+#define DEINTERLACE_POLAR 0x18
-+#define DEINTERLACE_POLAR_FIELD(x) ((x) & 1)
-+
-+/* all pitch registers accept 16-bit values */
-+#define DEINTERLACE_IN_PITCH0 0x20
-+#define DEINTERLACE_IN_PITCH1 0x24
-+#define DEINTERLACE_IN_PITCH2 0x28
-+#define DEINTERLACE_OUT_PITCH0 0x30
-+#define DEINTERLACE_OUT_PITCH1 0x34
-+#define DEINTERLACE_OUT_PITCH2 0x38
-+#define DEINTERLACE_FLAG_PITCH 0x40
-+#define DEINTERLACE_IN0_ADDR0 0x50
-+#define DEINTERLACE_IN0_ADDR1 0x54
-+#define DEINTERLACE_IN0_ADDR2 0x58
-+#define DEINTERLACE_IN0_ADDRH 0x5c
-+#define DEINTERLACE_IN1_ADDR0 0x60
-+#define DEINTERLACE_IN1_ADDR1 0x64
-+#define DEINTERLACE_IN1_ADDR2 0x68
-+#define DEINTERLACE_IN1_ADDRH 0x6c
-+#define DEINTERLACE_IN2_ADDR0 0x70
-+#define DEINTERLACE_IN2_ADDR1 0x74
-+#define DEINTERLACE_IN2_ADDR2 0x78
-+#define DEINTERLACE_IN2_ADDRH 0x7c
-+#define DEINTERLACE_IN3_ADDR0 0x80
-+#define DEINTERLACE_IN3_ADDR1 0x84
-+#define DEINTERLACE_IN3_ADDR2 0x88
-+#define DEINTERLACE_IN3_ADDRH 0x8c
-+#define DEINTERLACE_OUT_ADDR0 0x90
-+#define DEINTERLACE_OUT_ADDR1 0x94
-+#define DEINTERLACE_OUT_ADDR2 0x98
-+#define DEINTERLACE_OUT_ADDRH 0x9c
-+#define DEINTERLACE_IN_FLAG_ADDR 0xa0
-+#define DEINTERLACE_OUT_FLAG_ADDR 0xa4
-+#define DEINTERLACE_FLAG_ADDRH 0xa8
-+
-+#define DEINTERLACE_ADDRH0(x) ((x) & 0xff)
-+#define DEINTERLACE_ADDRH1(x) (((x) & 0xff) << 8)
-+#define DEINTERLACE_ADDRH2(x) (((x) & 0xff) << 16)
-+
-+#define DEINTERLACE_MODE 0xb0
-+#define DEINTERLACE_MODE_DEINT_LUMA BIT(0)
-+#define DEINTERLACE_MODE_MOTION_EN BIT(4)
-+#define DEINTERLACE_MODE_INTP_EN BIT(5)
-+#define DEINTERLACE_MODE_AUTO_UPD_MODE(x) (((x) & 3) << 12)
-+#define DEINTERLACE_MODE_DEINT_CHROMA BIT(16)
-+#define DEINTERLACE_MODE_FIELD_MODE BIT(31)
-+
-+#define DEINTERLACE_MD_PARAM0 0xb4
-+#define DEINTERLACE_MD_PARAM0_MIN_LUMA_TH(x) ((x) & 0xff)
-+#define DEINTERLACE_MD_PARAM0_MAX_LUMA_TH(x) (((x) & 0xff) << 8)
-+#define DEINTERLACE_MD_PARAM0_AVG_LUMA_SHIFT(x) (((x) & 0xf) << 16)
-+#define DEINTERLACE_MD_PARAM0_TH_SHIFT(x) (((x) & 0xf) << 24)
-+
-+#define DEINTERLACE_MD_PARAM1 0xb8
-+#define DEINTERLACE_MD_PARAM1_MOV_FAC_NONEDGE(x) (((x) & 0x3) << 28)
-+
-+#define DEINTERLACE_MD_PARAM2 0xbc
-+#define DEINTERLACE_MD_PARAM2_CHROMA_SPATIAL_TH(x) (((x) & 0xff) << 8)
-+#define DEINTERLACE_MD_PARAM2_CHROMA_DIFF_TH(x) (((x) & 0xff) << 16)
-+#define DEINTERLACE_MD_PARAM2_PIX_STATIC_TH(x) (((x) & 0x3) << 28)
-+
-+#define DEINTERLACE_INTP_PARAM0 0xc0
-+#define DEINTERLACE_INTP_PARAM0_ANGLE_LIMIT(x) ((x) & 0x1f)
-+#define DEINTERLACE_INTP_PARAM0_ANGLE_CONST_TH(x) (((x) & 7) << 8)
-+#define DEINTERLACE_INTP_PARAM0_LUMA_CUR_FAC_MODE(x) (((x) & 7) << 16)
-+#define DEINTERLACE_INTP_PARAM0_LUMA_CUR_FAC_MODE_MSK (7 << 16)
-+#define DEINTERLACE_INTP_PARAM0_CHROMA_CUR_FAC_MODE(x) (((x) & 7) << 20)
-+#define DEINTERLACE_INTP_PARAM0_CHROMA_CUR_FAC_MODE_MSK (7 << 20)
-+
-+#define DEINTERLACE_MD_CH_PARAM 0xc4
-+#define DEINTERLACE_MD_CH_PARAM_BLEND_MODE(x) ((x) & 0xf)
-+#define DEINTERLACE_MD_CH_PARAM_FONT_PRO_EN BIT(8)
-+#define DEINTERLACE_MD_CH_PARAM_FONT_PRO_TH(x) (((x) & 0xff) << 16)
-+#define DEINTERLACE_MD_CH_PARAM_FONT_PRO_FAC(x) (((x) & 0x1f) << 24)
-+
-+#define DEINTERLACE_INTP_PARAM1 0xc8
-+#define DEINTERLACE_INTP_PARAM1_A(x) ((x) & 7)
-+#define DEINTERLACE_INTP_PARAM1_EN BIT(3)
-+#define DEINTERLACE_INTP_PARAM1_C(x) (((x) & 0xf) << 4)
-+#define DEINTERLACE_INTP_PARAM1_CMAX(x) (((x) & 0xff) << 8)
-+#define DEINTERLACE_INTP_PARAM1_MAXRAT(x) (((x) & 3) << 16)
-+
-+#define DEINTERLACE_OUT_PATH 0x200
-+
-+#define DEINTERLACE_MIN_WIDTH 2U
-+#define DEINTERLACE_MIN_HEIGHT 2U
-+#define DEINTERLACE_MAX_WIDTH 2048U
-+#define DEINTERLACE_MAX_HEIGHT 1100U
-+
-+struct deinterlace_ctx {
-+ struct v4l2_fh fh;
-+ struct deinterlace_dev *dev;
-+
-+ struct v4l2_pix_format src_fmt;
-+ struct v4l2_pix_format dst_fmt;
-+
-+ void *flag1_buf;
-+ dma_addr_t flag1_buf_dma;
-+
-+ void *flag2_buf;
-+ dma_addr_t flag2_buf_dma;
-+
-+ struct vb2_v4l2_buffer *prev[2];
-+
-+ unsigned int first_field;
-+ unsigned int field;
-+
-+ int aborting;
-+};
-+
-+struct deinterlace_dev {
-+ struct v4l2_device v4l2_dev;
-+ struct video_device vfd;
-+ struct device *dev;
-+ struct v4l2_m2m_dev *m2m_dev;
-+
-+ /* Device file mutex */
-+ struct mutex dev_mutex;
-+
-+ void __iomem *base;
-+
-+ struct clk *bus_clk;
-+ struct clk *mod_clk;
-+ struct clk *ram_clk;
-+
-+ struct reset_control *rstc;
-+};
-+
-+#endif
diff --git a/0041-arm64-dts-h6-deinterlace.patch b/0041-arm64-dts-h6-deinterlace.patch
deleted file mode 100644
index 265437c41923..000000000000
--- a/0041-arm64-dts-h6-deinterlace.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From c009b3b707bbde30fa6ff49ca3075160524ea7b9 Mon Sep 17 00:00:00 2001
-From: Jernej Skrabec <jernej.skrabec@siol.net>
-Date: Tue, 26 May 2020 20:08:27 +0200
-Subject: [PATCH 41/44] arm64: dts: h6 deinterlace
-
-Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
----
- arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 11 +++++++++++
- 1 file changed, 11 insertions(+)
-
---- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
-+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
-@@ -153,6 +153,17 @@
- };
- };
-
-+ deinterlace: deinterlace@1420000 {
-+ compatible = "allwinner,sun50i-h6-deinterlace";
-+ reg = <0x01420000 0x2000>;
-+ clocks = <&ccu CLK_BUS_DEINTERLACE>,
-+ <&ccu CLK_DEINTERLACE>,
-+ <&ccu CLK_MBUS_DEINTERLACE>;
-+ clock-names = "bus", "mod", "ram";
-+ resets = <&ccu RST_BUS_DEINTERLACE>;
-+ interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
-+ };
-+
- video-codec@1c0e000 {
- compatible = "allwinner,sun50i-h6-video-engine";
- reg = <0x01c0e000 0x2000>;
-
-
diff --git a/HACK-media-uapi-hevc-tiles-and-num_slices.patch b/HACK-media-uapi-hevc-tiles-and-num_slices.patch
new file mode 100644
index 000000000000..65dc37f12816
--- /dev/null
+++ b/HACK-media-uapi-hevc-tiles-and-num_slices.patch
@@ -0,0 +1,37 @@
+From 59b72897a905b8254ac5ff697465bc02e2d0e87e Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas@kwiboo.se>
+Date: Sat, 23 May 2020 15:07:15 +0000
+Subject: [PATCH 055/101] HACK: media: uapi: hevc: tiles and num_slices
+
+---
+ include/media/hevc-ctrls.h | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/include/media/hevc-ctrls.h b/include/media/hevc-ctrls.h
+index a808894e8..f1b875652 100644
+--- 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;
+--
+2.31.1
+
diff --git a/PKGBUILD b/PKGBUILD
index effca06d51f2..9d08ea47f716 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -6,63 +6,96 @@
# https://github.com/armbian/build/tree/master/patch/kernel/archive/sunxi-5.11
pkgbase=linux-tqc-a01
-_srcname=linux-5.14
+_srcname=linux-5.17
_kernelname=${pkgbase#linux}
_desc="AArch64 kernel for TQC A01"
-pkgver=5.14.8
+pkgver=5.17.7
pkgrel=1
arch=('aarch64')
url="http://www.kernel.org/"
license=('GPL2')
makedepends=('xmlto' 'docbook-xsl' 'kmod' 'inetutils' 'bc' 'git' 'uboot-tools' 'vboot-utils' 'dtc')
options=('!strip')
-source=("http://cdn.kernel.org/pub/linux/kernel/v5.x/${_srcname}.tar.xz"
+source=(
+ # "http://cdn.kernel.org/pub/linux/kernel/v5.x/${_srcname}.tar.xz"
+ "https://mirror.bjtu.edu.cn/kernel/linux/kernel/v5.x/${_srcname}.tar.xz"
'sun50i-h6-tqc-a01.dts'
- '0001-mfd-Add-support-for-AC200.patch'
- '0001-HACK-h6-Add-HDMI-sound-card.patch'
- '0001-make-proc-cpuinfo-consistent-on-arm64-and-arm.patch'
- '0002-net-phy-Add-support-for-AC200-EPHY.patch'
- '0002-net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regu.patch'
- '0003-net-stmmac-sun8i-Rename-PHY-regulator-variable-to-re.patch'
- '0003-arm64-dts-allwinner-h6-Add-AC200-EPHY-related-nodes.patch'
- '0004-net-stmmac-sun8i-Add-support-for-enabling-a-regulato.patch'
- '0005-drm-gem-cma-Export-with-handle-allocator.patch'
- '0006-drm-sun4i-Add-GEM-allocator.patch'
- '0010-general-h6-add-dma-i2c-ir-spi-uart.patch'
- '0011-dts-h6-tqc-a01-cpu-opp-2ghz.patch'
- '0012-arm64-h6-gpu-devfreq-enable.patch'
- '0040-wip-H6-deinterlace.patch'
- '0041-arm64-dts-h6-deinterlace.patch'
+ # custom
+ '0001-make-proc-cpuinfo-consistent-on-arm64-and-arm.patch'
+ '0011-dts-h6-tqc-a01-cpu-opp-2ghz.patch'
+ '0012-arm64-h6-gpu-devfreq-enable.patch'
+ # emmc
+ '0012-fix-h6-emmc.patch'
+ '0013-x-fix-h6-emmc-dts.patch'
+ # ethernet
+ 'arm64-dts-sun50i-h6-Add-AC200-EPHY-related-nodes.patch'
+ 'drv-net-phy-Add-support-for-AC200-EPHY.patch'
+ 'drv-mfd-Add-support-for-AC200.patch'
+ 'net-stmmac-sun8i-Add-support-for-enabling-a-regulator-for-PHY-I.patch'
+ 'net-stmmac-sun8i-Rename-PHY-regulator-variable-to-regulator_phy.patch'
+ 'net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regulator.patch'
+ # hdmi sound
+ 'arm64-dts-allwinner-h6-Add-hdmi-sound-card.patch'
+ # audio codec
+ '0009-allwinner-h6-support-ac200-audio-codec.patch'
+ # misc
+ '0010-allwinner-add-sunxi_get_soc_chipid-and-sunxi_get_ser.patch'
+ 'arm64-dts-sun50i-h6.dtsi-improve-thermals.patch'
+ 'arm64-dts-allwinner-h6-Add-SCPI-protocol.patch'
+ 'arm64-dts-allwinner-h6-Protect-SCP-clocks.patch'
+ 'drv-pinctrl-sunxi-pinctrl-sun50i-h6.c-GPIO-disable_strict_mode.patch'
+ # cedrus
+ 'WIP-media-uapi-hevc-add-fields-needed-for-rkvdec.patch'
+ 'HACK-media-uapi-hevc-tiles-and-num_slices.patch'
+ 'Revert-net-Remove-net-ipx.h-and-uapi-linux-ipx.h-hea.patch'
+ 'drv-media-cedrus-10-bit-HEVC-support.patch'
+ 'drv-media-cedrus-Add-callback-for-buffer-cleanup.patch'
+ 'drv-media-cedrus-h264-Improve-buffer-management.patch'
+ 'drv-media-cedrus-hevc-Improve-buffer-management.patch'
+ 'drv-media-cedrus-hevc-tiles-hack.patch'
+
'config'
'linux.preset'
'60-linux.hook'
'90-linux.hook')
[[ ${pkgver##*.} != 0 ]] && \
-source+=("https://cdn.kernel.org/pub/linux/kernel/v5.x/patch-${pkgver}.xz")
+# source+=("https://cdn.kernel.org/pub/linux/kernel/v5.x/patch-${pkgver}.xz")
+source+=("https://mirror.bjtu.edu.cn/kernel/linux/kernel/v5.x/patch-${pkgver}.xz")
-md5sums=('a082ef5748b813abca0649dab8be5f52'
- '46d921dba031a9f397955a787c71911e'
- '17aa0c69176c68cd98b4522740a1b747'
- '2285d81ec6fb859d34b7abfd46a59550'
+md5sums=('07321a70a48d062cebd0358132f11771'
+ '5dc58208abd2ad11ad2aa67fadf1c66f'
'7a18066683f3351b2bbd2653db783f80'
- 'bc7904920675ba8d38f21d46ffac33b5'
- '94a69594f90309c50c83a5cc8579fb54'
- 'e1868e41094baff9eceba481fc097c79'
- '2d2de8db5e0c7d8f51a05fd33000c19a'
- '5d42a68276c8f9e8b3de040fa2579b84'
- '335382823f6dc2aae2f6038b7aee339e'
- 'cb38b30491472097c3b9b475de39127f'
- 'bc65c0b9e4d6fb2fe3a81b8358886885'
'74baf0cb243b3abd5e38f0131c95408f'
- '05c4d9cbe622d5ff15e6b84b1c5c1a70'
- 'd1543c205b4faf9be4552d4308228217'
- 'e4ef0ae46cdfb23abb11d729452f68b2'
- '80fec552244267a059d06399c1a3c931'
+ '947f64e1c0eec0564cb683940a5af51f'
+ '6c58c6697e1275038acf579251c69d31'
+ '2d7918618ec227b65d35078b3c7862ce'
+ '5cf059c6de6dbee8d20041dcb735f5b1'
+ 'f0826f12d7b1f597fba32913e8580543'
+ '714a3df875f3a05aee07c7c464ad3fe0'
+ 'c6bb7c8ce8d41c93d5c2b70f4110135f'
+ 'abe164c89da5fb50bb4c866c1d5fe03b'
+ '72a95b87caccf7f36dff15ed1e4a6df9'
+ 'f8aa3197a5c1e6d01cb1809c31cc2d92'
+ 'eda5ceb6d7f63318bba5ec63c601ae93'
+ 'a709f3089148690f41c739275e66e9b0'
+ '99368425ced226332796b7f69fda3a2b'
+ '6ab19f7244b9f82f56edabeb7e1e1004'
+ 'a95bab65e3009909138c0982ab7234aa'
+ '113ec102b9b94a8c8c44dbde7e9b8d59'
+ '196331c28fc1c77f78d7c6378cfb9e9e'
+ 'ec38509f11f44b412f4de990502a3fb7'
+ '52d4ddae2d47320b97ce311106b407af'
+ '2eb1edf94864c3c0b2a6f82463f84d67'
+ '28ce48cd57b8776a75f4fed54569ffd1'
+ 'f5e2e35d9f0955cef5cf2332f901ff09'
+ 'b36af4f711a0aeb3f0edeb522a9e97bf'
+ 'dafb6c0da0e1c6be55c18fc50c850fab'
+ 'ce726485a1ab9c726037aa02fdfa15f1'
'66e0ae63183426b28c0ec0c7e10b5e16'
'ce6c81ad1ad1f8b333fd6077d47abdaf'
'3dc88030a8f2f5a5f97266d99b149f77'
- '767e2bd13b4f1497f7500877792cbff2')
+ 'c942f79b0f310ca6e8d5828fad539a7f')
prepare() {
cd ${_srcname}
@@ -76,22 +109,39 @@ prepare() {
echo "dtb-\$(CONFIG_ARCH_SUNXI) += ${target_dts//dts/dtb}" >> "./arch/arm64/boot/dts/allwinner/Makefile"
cat "${srcdir}/${target_dts}" > "./arch/arm64/boot/dts/allwinner/${target_dts}"
- # patches for TQC A01
- patch -p1 < ../0001-mfd-Add-support-for-AC200.patch
- patch -p1 < ../0001-HACK-h6-Add-HDMI-sound-card.patch
+ # patches
patch -p1 < ../0001-make-proc-cpuinfo-consistent-on-arm64-and-arm.patch
- patch -p1 < ../0002-net-phy-Add-support-for-AC200-EPHY.patch
- patch -p1 < ../0002-net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regu.patch
- patch -p1 < ../0003-net-stmmac-sun8i-Rename-PHY-regulator-variable-to-re.patch
- patch -p1 < ../0003-arm64-dts-allwinner-h6-Add-AC200-EPHY-related-nodes.patch
- patch -p1 < ../0004-net-stmmac-sun8i-Add-support-for-enabling-a-regulato.patch
- patch -p1 < ../0005-drm-gem-cma-Export-with-handle-allocator.patch
- patch -p1 < ../0006-drm-sun4i-Add-GEM-allocator.patch
- patch -p1 < ../0010-general-h6-add-dma-i2c-ir-spi-uart.patch
patch -p1 < ../0011-dts-h6-tqc-a01-cpu-opp-2ghz.patch
patch -p1 < ../0012-arm64-h6-gpu-devfreq-enable.patch
- patch -p1 < ../0040-wip-H6-deinterlace.patch
- patch -p1 < ../0041-arm64-dts-h6-deinterlace.patch
+
+ patch -p1 < ../0012-fix-h6-emmc.patch
+ patch -p1 < ../0013-x-fix-h6-emmc-dts.patch
+
+ patch -p1 < ../arm64-dts-sun50i-h6-Add-AC200-EPHY-related-nodes.patch
+ patch -p1 < ../drv-net-phy-Add-support-for-AC200-EPHY.patch
+ patch -p1 < ../drv-mfd-Add-support-for-AC200.patch
+ patch -p1 < ../net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regulator.patch
+ patch -p1 < ../net-stmmac-sun8i-Rename-PHY-regulator-variable-to-regulator_phy.patch
+ patch -p1 < ../net-stmmac-sun8i-Add-support-for-enabling-a-regulator-for-PHY-I.patch
+
+ patch -p1 < ../arm64-dts-allwinner-h6-Add-hdmi-sound-card.patch
+
+ patch -p1 < ../0009-allwinner-h6-support-ac200-audio-codec.patch
+
+ patch -p1 < ../0010-allwinner-add-sunxi_get_soc_chipid-and-sunxi_get_ser.patch
+ patch -p1 < ../arm64-dts-sun50i-h6.dtsi-improve-thermals.patch
+ patch -p1 < ../arm64-dts-allwinner-h6-Add-SCPI-protocol.patch
+ patch -p1 < ../arm64-dts-allwinner-h6-Protect-SCP-clocks.patch
+ patch -p1 < ../drv-pinctrl-sunxi-pinctrl-sun50i-h6.c-GPIO-disable_strict_mode.patch
+
+ patch -p1 < ../WIP-media-uapi-hevc-add-fields-needed-for-rkvdec.patch
+ patch -p1 < ../HACK-media-uapi-hevc-tiles-and-num_slices.patch
+ patch -p1 < ../Revert-net-Remove-net-ipx.h-and-uapi-linux-ipx.h-hea.patch
+ patch -p1 < ../drv-media-cedrus-10-bit-HEVC-support.patch
+ patch -p1 < ../drv-media-cedrus-Add-callback-for-buffer-cleanup.patch
+ patch -p1 < ../drv-media-cedrus-h264-Improve-buffer-management.patch
+ patch -p1 < ../drv-media-cedrus-hevc-Improve-buffer-management.patch
+ patch -p1 < ../drv-media-cedrus-hevc-tiles-hack.patch
cat "${srcdir}/config" > ./.config
diff --git a/Revert-net-Remove-net-ipx.h-and-uapi-linux-ipx.h-hea.patch b/Revert-net-Remove-net-ipx.h-and-uapi-linux-ipx.h-hea.patch
new file mode 100644
index 000000000000..63d36cae38ec
--- /dev/null
+++ b/Revert-net-Remove-net-ipx.h-and-uapi-linux-ipx.h-hea.patch
@@ -0,0 +1,287 @@
+From e3e9a55245fcadd5658cf783a3c273b4b4835b9e Mon Sep 17 00:00:00 2001
+From: Igor Pecovnik <igor.pecovnik@gmail.com>
+Date: Sat, 6 Nov 2021 19:15:23 +0100
+Subject: [PATCH 003/101] Revert "net: Remove net/ipx.h and uapi/linux/ipx.h
+ header files"
+
+This reverts commit 6c9b40844751ea30c72f7a2f92f4d704bc6b2927.
+---
+ include/net/ipx.h | 171 +++++++++++++++++++++++++++++++++++++++
+ include/uapi/linux/ipx.h | 87 ++++++++++++++++++++
+ 2 files changed, 258 insertions(+)
+ create mode 100644 include/net/ipx.h
+ create mode 100644 include/uapi/linux/ipx.h
+
+diff --git a/include/net/ipx.h b/include/net/ipx.h
+new file mode 100644
+index 000000000..9d1342807
+--- /dev/null
++++ b/include/net/ipx.h
+@@ -0,0 +1,171 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++#ifndef _NET_INET_IPX_H_
++#define _NET_INET_IPX_H_
++/*
++ * The following information is in its entirety obtained from:
++ *
++ * Novell 'IPX Router Specification' Version 1.10
++ * Part No. 107-000029-001
++ *
++ * Which is available from ftp.novell.com
++ */
++
++#include <linux/netdevice.h>
++#include <net/datalink.h>
++#include <linux/ipx.h>
++#include <linux/list.h>
++#include <linux/slab.h>
++#include <linux/refcount.h>
++
++struct ipx_address {
++ __be32 net;
++ __u8 node[IPX_NODE_LEN];
++ __be16 sock;
++};
++
++#define ipx_broadcast_node "\377\377\377\377\377\377"
++#define ipx_this_node "\0\0\0\0\0\0"
++
++#define IPX_MAX_PPROP_HOPS 8
++
++struct ipxhdr {
++ __be16 ipx_checksum __packed;
++#define IPX_NO_CHECKSUM cpu_to_be16(0xFFFF)
++ __be16 ipx_pktsize __packed;
++ __u8 ipx_tctrl;
++ __u8 ipx_type;
++#define IPX_TYPE_UNKNOWN 0x00
++#define IPX_TYPE_RIP 0x01 /* may also be 0 */
++#define IPX_TYPE_SAP 0x04 /* may also be 0 */
++#define IPX_TYPE_SPX 0x05 /* SPX protocol */
++#define IPX_TYPE_NCP 0x11 /* $lots for docs on this (SPIT) */
++#define IPX_TYPE_PPROP 0x14 /* complicated flood fill brdcast */
++ struct ipx_address ipx_dest __packed;
++ struct ipx_address ipx_source __packed;
++};
++
++/* From af_ipx.c */
++extern int sysctl_ipx_pprop_broadcasting;
++
++struct ipx_interface {
++ /* IPX address */
++ __be32 if_netnum;
++ unsigned char if_node[IPX_NODE_LEN];
++ refcount_t refcnt;
++
++ /* physical device info */
++ struct net_device *if_dev;
++ struct datalink_proto *if_dlink;
++ __be16 if_dlink_type;
++
++ /* socket support */
++ unsigned short if_sknum;
++ struct hlist_head if_sklist;
++ spinlock_t if_sklist_lock;
++
++ /* administrative overhead */
++ int if_ipx_offset;
++ unsigned char if_internal;
++ unsigned char if_primary;
++
++ struct list_head node; /* node in ipx_interfaces list */
++};
++
++struct ipx_route {
++ __be32 ir_net;
++ struct ipx_interface *ir_intrfc;
++ unsigned char ir_routed;
++ unsigned char ir_router_node[IPX_NODE_LEN];
++ struct list_head node; /* node in ipx_routes list */
++ refcount_t refcnt;
++};
++
++struct ipx_cb {
++ u8 ipx_tctrl;
++ __be32 ipx_dest_net;
++ __be32 ipx_source_net;
++ struct {
++ __be32 netnum;
++ int index;
++ } last_hop;
++};
++
++#include <net/sock.h>
++
++struct ipx_sock {
++ /* struct sock has to be the first member of ipx_sock */
++ struct sock sk;
++ struct ipx_address dest_addr;
++ struct ipx_interface *intrfc;
++ __be16 port;
++#ifdef CONFIG_IPX_INTERN
++ unsigned char node[IPX_NODE_LEN];
++#endif
++ unsigned short type;
++ /*
++ * To handle special ncp connection-handling sockets for mars_nwe,
++ * the connection number must be stored in the socket.
++ */
++ unsigned short ipx_ncp_conn;
++};
++
++static inline struct ipx_sock *ipx_sk(struct sock *sk)
++{
++ return (struct ipx_sock *)sk;
++}
++
++#define IPX_SKB_CB(__skb) ((struct ipx_cb *)&((__skb)->cb[0]))
++
++#define IPX_MIN_EPHEMERAL_SOCKET 0x4000
++#define IPX_MAX_EPHEMERAL_SOCKET 0x7fff
++
++extern struct list_head ipx_routes;
++extern rwlock_t ipx_routes_lock;
++
++extern struct list_head ipx_interfaces;
++struct ipx_interface *ipx_interfaces_head(void);
++extern spinlock_t ipx_interfaces_lock;
++
++extern struct ipx_interface *ipx_primary_net;
++
++int ipx_proc_init(void);
++void ipx_proc_exit(void);
++
++const char *ipx_frame_name(__be16);
++const char *ipx_device_name(struct ipx_interface *intrfc);
++
++static __inline__ void ipxitf_hold(struct ipx_interface *intrfc)
++{
++ refcount_inc(&intrfc->refcnt);
++}
++
++void ipxitf_down(struct ipx_interface *intrfc);
++struct ipx_interface *ipxitf_find_using_net(__be32 net);
++int ipxitf_send(struct ipx_interface *intrfc, struct sk_buff *skb, char *node);
++__be16 ipx_cksum(struct ipxhdr *packet, int length);
++int ipxrtr_add_route(__be32 network, struct ipx_interface *intrfc,
++ unsigned char *node);
++void ipxrtr_del_routes(struct ipx_interface *intrfc);
++int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx,
++ struct msghdr *msg, size_t len, int noblock);
++int ipxrtr_route_skb(struct sk_buff *skb);
++struct ipx_route *ipxrtr_lookup(__be32 net);
++int ipxrtr_ioctl(unsigned int cmd, void __user *arg);
++
++static __inline__ void ipxitf_put(struct ipx_interface *intrfc)
++{
++ if (refcount_dec_and_test(&intrfc->refcnt))
++ ipxitf_down(intrfc);
++}
++
++static __inline__ void ipxrtr_hold(struct ipx_route *rt)
++{
++ refcount_inc(&rt->refcnt);
++}
++
++static __inline__ void ipxrtr_put(struct ipx_route *rt)
++{
++ if (refcount_dec_and_test(&rt->refcnt))
++ kfree(rt);
++}
++#endif /* _NET_INET_IPX_H_ */
+diff --git a/include/uapi/linux/ipx.h b/include/uapi/linux/ipx.h
+new file mode 100644
+index 000000000..3168137ad
+--- /dev/null
++++ b/include/uapi/linux/ipx.h
+@@ -0,0 +1,87 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
++#ifndef _IPX_H_
++#define _IPX_H_
++#include <linux/libc-compat.h> /* for compatibility with glibc netipx/ipx.h */
++#include <linux/types.h>
++#include <linux/sockios.h>
++#include <linux/socket.h>
++#define IPX_NODE_LEN 6
++#define IPX_MTU 576
++
++#if __UAPI_DEF_SOCKADDR_IPX
++struct sockaddr_ipx {
++ __kernel_sa_family_t sipx_family;
++ __be16 sipx_port;
++ __be32 sipx_network;
++ unsigned char sipx_node[IPX_NODE_LEN];
++ __u8 sipx_type;
++ unsigned char sipx_zero; /* 16 byte fill */
++};
++#endif /* __UAPI_DEF_SOCKADDR_IPX */
++
++/*
++ * So we can fit the extra info for SIOCSIFADDR into the address nicely
++ */
++#define sipx_special sipx_port
++#define sipx_action sipx_zero
++#define IPX_DLTITF 0
++#define IPX_CRTITF 1
++
++#if __UAPI_DEF_IPX_ROUTE_DEFINITION
++struct ipx_route_definition {
++ __be32 ipx_network;
++ __be32 ipx_router_network;
++ unsigned char ipx_router_node[IPX_NODE_LEN];
++};
++#endif /* __UAPI_DEF_IPX_ROUTE_DEFINITION */
++
++#if __UAPI_DEF_IPX_INTERFACE_DEFINITION
++struct ipx_interface_definition {
++ __be32 ipx_network;
++ unsigned char ipx_device[16];
++ unsigned char ipx_dlink_type;
++#define IPX_FRAME_NONE 0
++#define IPX_FRAME_SNAP 1
++#define IPX_FRAME_8022 2
++#define IPX_FRAME_ETHERII 3
++#define IPX_FRAME_8023 4
++#define IPX_FRAME_TR_8022 5 /* obsolete */
++ unsigned char ipx_special;
++#define IPX_SPECIAL_NONE 0
++#define IPX_PRIMARY 1
++#define IPX_INTERNAL 2
++ unsigned char ipx_node[IPX_NODE_LEN];
++};
++#endif /* __UAPI_DEF_IPX_INTERFACE_DEFINITION */
++
++#if __UAPI_DEF_IPX_CONFIG_DATA
++struct ipx_config_data {
++ unsigned char ipxcfg_auto_select_primary;
++ unsigned char ipxcfg_auto_create_interfaces;
++};
++#endif /* __UAPI_DEF_IPX_CONFIG_DATA */
++
++/*
++ * OLD Route Definition for backward compatibility.
++ */
++
++#if __UAPI_DEF_IPX_ROUTE_DEF
++struct ipx_route_def {
++ __be32 ipx_network;
++ __be32 ipx_router_network;
++#define IPX_ROUTE_NO_ROUTER 0
++ unsigned char ipx_router_node[IPX_NODE_LEN];
++ unsigned char ipx_device[16];
++ unsigned short ipx_flags;
++#define IPX_RT_SNAP 8
++#define IPX_RT_8022 4
++#define IPX_RT_BLUEBOOK 2
++#define IPX_RT_ROUTED 1
++};
++#endif /* __UAPI_DEF_IPX_ROUTE_DEF */
++
++#define SIOCAIPXITFCRT (SIOCPROTOPRIVATE)
++#define SIOCAIPXPRISLT (SIOCPROTOPRIVATE + 1)
++#define SIOCIPXCFGDATA (SIOCPROTOPRIVATE + 2)
++#define SIOCIPXNCPCONN (SIOCPROTOPRIVATE + 3)
++#endif /* _IPX_H_ */
+--
+2.31.1
+
diff --git a/WIP-media-uapi-hevc-add-fields-needed-for-rkvdec.patch b/WIP-media-uapi-hevc-add-fields-needed-for-rkvdec.patch
new file mode 100644
index 000000000000..5d99721b10fa
--- /dev/null
+++ b/WIP-media-uapi-hevc-add-fields-needed-for-rkvdec.patch
@@ -0,0 +1,66 @@
+From b47ff0ab5ea204f3db72e8ab1c1b4a69679e6441 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas@kwiboo.se>
+Date: Sat, 23 May 2020 15:03:46 +0000
+Subject: [PATCH 054/101] WIP: media: uapi: hevc: add fields needed for rkvdec
+
+NOTE: these fields are used by rkvdec hevc backend
+
+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
+---
+ include/media/hevc-ctrls.h | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/include/media/hevc-ctrls.h b/include/media/hevc-ctrls.h
+index ef63bc205..a808894e8 100644
+--- a/include/media/hevc-ctrls.h
++++ b/include/media/hevc-ctrls.h
+@@ -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;
+ __u16 pic_width_in_luma_samples;
+ __u16 pic_height_in_luma_samples;
+ __u8 bit_depth_luma_minus8;
+@@ -81,6 +83,8 @@ struct v4l2_ctrl_hevc_sps {
+ __u8 chroma_format_idc;
+ __u8 sps_max_sub_layers_minus1;
+
++ __u8 padding[6];
++
+ __u64 flags;
+ };
+
+@@ -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;
+@@ -123,7 +128,7 @@ struct v4l2_ctrl_hevc_pps {
+ __s8 pps_tc_offset_div2;
+ __u8 log2_parallel_merge_level_minus2;
+
+- __u8 padding[4];
++ __u8 padding;
+ __u64 flags;
+ };
+
+@@ -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;
++ __u16 short_term_ref_pic_set_size;
++ __u16 long_term_ref_pic_set_size;
++
++ __u8 padding[4];
+
+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */
+ struct v4l2_hevc_pred_weight_table pred_weight_table;
+--
+2.31.1
+
diff --git a/arm64-dts-allwinner-h6-Add-SCPI-protocol.patch b/arm64-dts-allwinner-h6-Add-SCPI-protocol.patch
new file mode 100644
index 000000000000..684e2328e44a
--- /dev/null
+++ b/arm64-dts-allwinner-h6-Add-SCPI-protocol.patch
@@ -0,0 +1,51 @@
+From 02c2f2e87095289bce9f122db8e7381cd8d73585 Mon Sep 17 00:00:00 2001
+From: Samuel Holland <samuel@sholland.org>
+Date: Sat, 14 Dec 2019 20:54:40 -0600
+Subject: [PATCH 161/456] arm64: dts: allwinner: h6: Add SCPI protocol
+
+Signed-off-by: Samuel Holland <samuel@sholland.org>
+---
+ arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+index 15decf102be2..6182ac2c1a68 100644
+--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+@@ -88,6 +88,13 @@ psci {
+ method = "smc";
+ };
+
++ scpi_protocol: scpi {
++ compatible = "arm,scpi";
++ mboxes = <&msgbox 2>, <&msgbox 3>;
++ mbox-names = "tx", "rx";
++ shmem = <&scpi_sram>;
++ };
++
+ timer {
+ compatible = "arm,armv8-timer";
+ arm,no-tick-in-suspend;
+@@ -205,6 +212,19 @@ syscon: syscon@3000000 {
+ #size-cells = <1>;
+ ranges;
+
++ sram_a2: sram@100000 {
++ compatible = "mmio-sram";
++ reg = <0x00100000 0x18000>;
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <0 0x00100000 0x18000>;
++
++ scpi_sram: scp-shmem@17c00 {
++ compatible = "arm,scp-shmem";
++ reg = <0x17c00 0x200>;
++ };
++ };
++
+ sram_c: sram@28000 {
+ compatible = "mmio-sram";
+ reg = <0x00028000 0x1e000>;
+--
+2.34.1
+
diff --git a/arm64-dts-allwinner-h6-Add-hdmi-sound-card.patch b/arm64-dts-allwinner-h6-Add-hdmi-sound-card.patch
new file mode 100644
index 000000000000..603522ba0505
--- /dev/null
+++ b/arm64-dts-allwinner-h6-Add-hdmi-sound-card.patch
@@ -0,0 +1,48 @@
+From adb0ca8feafa851620a83071a51864bcd4f420dc Mon Sep 17 00:00:00 2001
+From: Jernej Skrabec <jernej.skrabec@gmail.com>
+Date: Tue, 10 Nov 2020 20:43:28 +0100
+Subject: [PATCH 243/456] arm64: dts: allwinner: h6: Add hdmi sound card
+
+H6 supports HDMI audio. Add a sound card node for it.
+
+Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
+---
+ arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+index fbe94abbb1f9..60d7ee645c31 100644
+--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+@@ -101,6 +101,20 @@ scpi_protocol: scpi {
+ shmem = <&scpi_sram>;
+ };
+
++ sound_hdmi: sound_hdmi {
++ compatible = "allwinner,sun9i-a80-hdmi-audio",
++ "allwinner,sun50i-h6-hdmi-audio";
++ status = "disabled";
++
++ codec {
++ sound-dai = <&hdmi>;
++ };
++
++ cpu {
++ sound-dai = <&i2s1>;
++ };
++ };
++
+ timer {
+ compatible = "arm,armv8-timer";
+ arm,no-tick-in-suspend;
+@@ -805,6 +819,7 @@ ohci3: usb@5311400 {
+ };
+
+ hdmi: hdmi@6000000 {
++ #sound-dai-cells = <0>;
+ compatible = "allwinner,sun50i-h6-dw-hdmi";
+ reg = <0x06000000 0x10000>;
+ reg-io-width = <1>;
+--
+2.34.1
+
diff --git a/arm64-dts-allwinner-h6-Protect-SCP-clocks.patch b/arm64-dts-allwinner-h6-Protect-SCP-clocks.patch
new file mode 100644
index 000000000000..c295a76ef556
--- /dev/null
+++ b/arm64-dts-allwinner-h6-Protect-SCP-clocks.patch
@@ -0,0 +1,33 @@
+From d484d4f4a31aadfeebaaa40924467d9a482e883e Mon Sep 17 00:00:00 2001
+From: Samuel Holland <samuel@sholland.org>
+Date: Wed, 1 Jan 2020 16:04:01 -0600
+Subject: [PATCH 147/456] arm64: dts: allwinner: h6: Protect SCP clocks
+
+Signed-off-by: Samuel Holland <samuel@sholland.org>
+---
+ arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+index fbe94abbb1f9..15decf102be2 100644
+--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+@@ -239,6 +239,7 @@ ccu: clock@3001000 {
+ reg = <0x03001000 0x1000>;
+ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>;
+ clock-names = "hosc", "losc", "iosc";
++ protected-clocks = <CLK_BUS_MSGBOX>;
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+ };
+@@ -934,6 +935,7 @@ r_ccu: clock@7010000 {
+ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>,
+ <&ccu CLK_PLL_PERIPH0>;
+ clock-names = "hosc", "losc", "iosc", "pll-periph";
++ protected-clocks = <CLK_R_APB1_TWD>;
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+ };
+--
+2.34.1
+
diff --git a/0003-arm64-dts-allwinner-h6-Add-AC200-EPHY-related-nodes.patch b/arm64-dts-sun50i-h6-Add-AC200-EPHY-related-nodes.patch
index 6cb3c33c0ef7..c83054d5b144 100644
--- a/0003-arm64-dts-allwinner-h6-Add-AC200-EPHY-related-nodes.patch
+++ b/arm64-dts-sun50i-h6-Add-AC200-EPHY-related-nodes.patch
@@ -1,7 +1,7 @@
-From 1b08baab634bebd4ef94ca449b81d7550c91abf0 Mon Sep 17 00:00:00 2001
+From c843cbfb9d8c5b68ed2fedfd2d6905ec852f2873 Mon Sep 17 00:00:00 2001
From: Jernej Skrabec <jernej.skrabec@siol.net>
Date: Sun, 12 Jan 2020 12:09:12 +0100
-Subject: [PATCH 3/4] arm64: dts: allwinner: h6: Add AC200 EPHY related nodes
+Subject: [PATCH 011/101] arm64:dts: sun50i-h6: Add AC200 EPHY related nodes
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
---
@@ -9,12 +9,12 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
1 file changed, 63 insertions(+)
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
-index 3329283e38ab..81caf1e96407 100644
+index 6cdebbbff..7c17076d9 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
-@@ -16,6 +16,16 @@
- #address-cells = <1>;
- #size-cells = <1>;
+@@ -22,6 +22,16 @@ aliases {
+ mmc2 = &mmc2;
+ };
+ ac200_pwm_clk: ac200_clk {
+ compatible = "pwm-clock";
@@ -29,21 +29,21 @@ index 3329283e38ab..81caf1e96407 100644
cpus {
#address-cells = <1>;
#size-cells = <0>;
-@@ -248,5 +258,9 @@
- ths_calibration: thermal-sensor-calibration@14 {
+@@ -307,6 +317,10 @@ ths_calibration: thermal-sensor-calibration@14 {
reg = <0x14 0x8>;
};
-+
+
+ ephy_calibration: ephy-calibration@2c {
+ reg = <0x2c 0x2>;
+ };
-
++
cpu_speed_grade: cpu-speed-grade@1c {
-@@ -291,6 +305,14 @@
- function = "emac";
+ reg = <0x1c 0x4>;
+ };
+@@ -364,6 +378,14 @@ ext_rgmii_pins: rgmii-pins {
drive-strength = <40>;
};
-+
+
+ /omit-if-no-ref/
+ ext_rmii_pins: rmii_pins {
+ pins = "PA0", "PA1", "PA2", "PA3", "PA4",
@@ -51,22 +51,23 @@ index 3329283e38ab..81caf1e96407 100644
+ function = "emac";
+ drive-strength = <40>;
+ };
-
++
hdmi_pins: hdmi-pins {
pins = "PH8", "PH9", "PH10";
-@@ -311,6 +333,11 @@
- pins = "PD23", "PD24";
+ function = "hdmi";
+@@ -384,6 +406,11 @@ i2c2_pins: i2c2-pins {
function = "i2c2";
};
-+
+
+ i2c3_pins: i2c3-pins {
+ pins = "PB17", "PB18";
+ function = "i2c3";
+ };
-
++
mmc0_pins: mmc0-pins {
pins = "PF0", "PF1", "PF2", "PF3",
-@@ -329,6 +356,11 @@
+ "PF4", "PF5";
+@@ -401,6 +428,11 @@ mmc1_pins: mmc1-pins {
bias-pull-up;
};
@@ -78,7 +79,7 @@ index 3329283e38ab..81caf1e96407 100644
mmc2_pins: mmc2-pins {
pins = "PC1", "PC4", "PC5", "PC6",
"PC7", "PC8", "PC9", "PC10",
-@@ -504,6 +536,37 @@
+@@ -643,6 +675,38 @@ spi1: spi@5011000 {
#size-cells = <0>;
};
@@ -98,6 +99,7 @@ index 3329283e38ab..81caf1e96407 100644
+ ac200: mfd@10 {
+ compatible = "x-powers,ac200";
+ reg = <0x10>;
++ clocks = <&ac200_pwm_clk>;
+ interrupt-parent = <&pio>;
+ interrupts = <1 20 IRQ_TYPE_LEVEL_LOW>;
+ interrupt-controller;
@@ -117,5 +119,5 @@ index 3329283e38ab..81caf1e96407 100644
compatible = "allwinner,sun50i-h6-emac",
"allwinner,sun50i-a64-emac";
--
-2.20.1
+2.31.1
diff --git a/arm64-dts-sun50i-h6.dtsi-improve-thermals.patch b/arm64-dts-sun50i-h6.dtsi-improve-thermals.patch
new file mode 100644
index 000000000000..7638e8dd0449
--- /dev/null
+++ b/arm64-dts-sun50i-h6.dtsi-improve-thermals.patch
@@ -0,0 +1,111 @@
+From 9eac817d9c58eee57d287e09e1ff1b5e62746342 Mon Sep 17 00:00:00 2001
+From: The-going <48602507+The-going@users.noreply.github.com>
+Date: Tue, 25 Jan 2022 17:02:30 +0300
+Subject: [PATCH 093/101] arm64:dts: sun50i-h6.dtsi improve thermals
+
+---
+ arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 68 ++++++++++++++++----
+ 1 file changed, 55 insertions(+), 13 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+index ceda702d6..35279469c 100644
+--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+@@ -1,5 +1,6 @@
+ // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+ // Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>
++// Copyright (C) 2020 Igor Pecovnik <igor@armbian.com>
+
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/clock/sun50i-h6-ccu.h>
+@@ -1177,33 +1178,74 @@ ths: thermal-sensor@5070400 {
+
+ thermal-zones {
+ cpu-thermal {
+- polling-delay-passive = <0>;
+- polling-delay = <0>;
++ polling-delay-passive = <250>;
++ polling-delay = <1000>;
+ thermal-sensors = <&ths 0>;
+
+ trips {
+- cpu_alert: cpu-alert {
++ cpu_warm: cpu_warm {
++ temperature = <75000>;
++ hysteresis = <2000>;
++ type = "passive";
++ };
++
++ cpu_hot_pre: cpu_hot_pre {
++ temperature = <80000>;
++ hysteresis = <2000>;
++ type = "passive";
++ };
++
++ cpu_hot: cpu_hot {
+ temperature = <85000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
+
+- cpu-crit {
+- temperature = <100000>;
+- hysteresis = <0>;
++ cpu_very_hot_pre: cpu_very_hot_pre {
++ temperature = <90000>;
++ hysteresis = <2000>;
++ type = "passive";
++ };
++
++ cpu_very_hot: cpu_very_hot {
++ temperature = <95000>;
++ hysteresis = <2000>;
++ type = "passive";
++ };
++
++ cpu_crit: cpu_crit {
++ temperature = <105000>;
++ hysteresis = <2000>;
+ type = "critical";
+ };
+ };
+
+ cooling-maps {
+- map0 {
+- trip = <&cpu_alert>;
+- cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+- <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+- <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+- <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
++ cpu_warm_limit_cpu {
++ trip = <&cpu_warm>;
++ cooling-device = <&cpu0 THERMAL_NO_LIMIT 2>;
+ };
+- };
++
++ cpu_hot_pre_limit_cpu {
++ trip = <&cpu_hot_pre>;
++ cooling-device = <&cpu0 2 3>;
++ };
++
++ cpu_hot_limit_cpu {
++ trip = <&cpu_hot>;
++ cooling-device = <&cpu0 3 4>;
++ };
++
++ cpu_very_hot_pre_limit_cpu {
++ trip = <&cpu_very_hot_pre>;
++ cooling-device = <&cpu0 5 6>;
++ };
++
++ cpu_very_hot_limit_cpu {
++ trip = <&cpu_very_hot>;
++ cooling-device = <&cpu0 7 THERMAL_NO_LIMIT>;
++ };
++ };
+ };
+
+ gpu-thermal {
+--
+2.31.1
+
diff --git a/config b/config
index 8aeec1b77607..8bd3f3270f49 100644
--- a/config
+++ b/config
@@ -1,19 +1,20 @@
#
# Automatically generated file; DO NOT EDIT.
-# Linux/arm64 5.14.8-1 Kernel Configuration
+# Linux/arm64 5.17.7-1 Kernel Configuration
#
-CONFIG_CC_VERSION_TEXT="gcc (GCC) 10.2.0"
+CONFIG_CC_VERSION_TEXT="gcc (GCC) 11.2.0"
CONFIG_CC_IS_GCC=y
-CONFIG_GCC_VERSION=100200
+CONFIG_GCC_VERSION=110200
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
-CONFIG_AS_VERSION=23500
+CONFIG_AS_VERSION=23800
CONFIG_LD_IS_BFD=y
-CONFIG_LD_VERSION=23500
+CONFIG_LD_VERSION=23800
CONFIG_LLD_VERSION=0
CONFIG_CC_CAN_LINK=y
CONFIG_CC_CAN_LINK_STATIC=y
CONFIG_CC_HAS_ASM_GOTO=y
+CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
CONFIG_IRQ_WORK=y
@@ -25,6 +26,7 @@ CONFIG_THREAD_INFO_IN_TASK=y
#
CONFIG_INIT_ENV_ARG_LIMIT=32
# CONFIG_COMPILE_TEST is not set
+# CONFIG_WERROR is not set
CONFIG_LOCALVERSION="-ARCH"
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_BUILD_SALT=""
@@ -60,7 +62,6 @@ CONFIG_GENERIC_IRQ_IPI=y
CONFIG_GENERIC_MSI_IRQ=y
CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
CONFIG_IRQ_MSI_IOMMU=y
-CONFIG_HANDLE_DOMAIN_IRQ=y
CONFIG_IRQ_FORCED_THREADING=y
CONFIG_SPARSE_IRQ=y
# CONFIG_GENERIC_IRQ_DEBUGFS is not set
@@ -70,6 +71,8 @@ CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_ARCH_HAS_TICK_BROADCAST=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y
+CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y
#
# Timers subsystem
@@ -99,6 +102,7 @@ CONFIG_USERMODE_DRIVER=y
# CONFIG_BPF_PRELOAD is not set
# end of BPF subsystem
+CONFIG_PREEMPT_VOLUNTARY_BUILD=y
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
@@ -145,6 +149,7 @@ CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=18
CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
+# CONFIG_PRINTK_INDEX is not set
CONFIG_GENERIC_SCHED_CLOCK=y
#
@@ -155,6 +160,7 @@ CONFIG_GENERIC_SCHED_CLOCK=y
CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
CONFIG_CC_HAS_INT128=y
+CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5"
CONFIG_ARCH_SUPPORTS_INT128=y
CONFIG_CGROUPS=y
CONFIG_PAGE_COUNTER=y
@@ -215,13 +221,11 @@ CONFIG_SYSFS_SYSCALL=y
CONFIG_FHANDLE=y
CONFIG_POSIX_TIMERS=y
CONFIG_PRINTK=y
-CONFIG_PRINTK_NMI=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_FUTEX_PI=y
-CONFIG_HAVE_FUTEX_CMPXCHG=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
@@ -241,6 +245,7 @@ CONFIG_RSEQ=y
# CONFIG_DEBUG_RSEQ is not set
# CONFIG_EMBEDDED is not set
CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_GUEST_PERF_EVENTS=y
# CONFIG_PC104 is not set
#
@@ -278,7 +283,6 @@ CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
CONFIG_GENERIC_HWEIGHT=y
@@ -363,6 +367,11 @@ CONFIG_ARM64_ERRATUM_1286807=y
CONFIG_ARM64_ERRATUM_1463225=y
CONFIG_ARM64_ERRATUM_1542419=y
CONFIG_ARM64_ERRATUM_1508412=y
+CONFIG_ARM64_ERRATUM_2051678=y
+CONFIG_ARM64_ERRATUM_2077057=y
+CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y
+CONFIG_ARM64_ERRATUM_2054223=y
+CONFIG_ARM64_ERRATUM_2067961=y
CONFIG_CAVIUM_ERRATUM_22375=y
CONFIG_CAVIUM_ERRATUM_23154=y
CONFIG_CAVIUM_ERRATUM_27456=y
@@ -389,6 +398,7 @@ CONFIG_ARM64_PA_BITS=48
# CONFIG_CPU_BIG_ENDIAN is not set
CONFIG_CPU_LITTLE_ENDIAN=y
CONFIG_SCHED_MC=y
+# CONFIG_SCHED_CLUSTER is not set
CONFIG_SCHED_SMT=y
CONFIG_NR_CPUS=8
CONFIG_HOTPLUG_CPU=y
@@ -401,7 +411,6 @@ CONFIG_HZ=100
CONFIG_SCHED_HRTICK=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_HW_PERF_EVENTS=y
-CONFIG_ARCH_HAS_FILTER_PGPROT=y
CONFIG_PARAVIRT=y
CONFIG_PARAVIRT_TIME_ACCOUNTING=y
CONFIG_KEXEC=y
@@ -412,6 +421,7 @@ CONFIG_TRANS_TABLE=y
# CONFIG_XEN is not set
CONFIG_FORCE_MAX_ZONEORDER=11
CONFIG_UNMAP_KERNEL_AT_EL0=y
+CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y
CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
# CONFIG_ARM64_SW_TTBR0_PAN is not set
CONFIG_ARM64_TAGGED_ADDR_ABI=y
@@ -436,6 +446,8 @@ CONFIG_ARM64_USE_LSE_ATOMICS=y
#
# ARMv8.2 architectural features
#
+CONFIG_AS_HAS_ARMV8_2=y
+CONFIG_AS_HAS_SHA3=y
# CONFIG_ARM64_PMEM is not set
CONFIG_ARM64_RAS_EXTN=y
CONFIG_ARM64_CNP=y
@@ -591,55 +603,6 @@ CONFIG_QORIQ_CPUFREQ=m
# end of CPU Frequency scaling
# end of CPU Power Management
-#
-# Firmware Drivers
-#
-CONFIG_ARM_SCMI_PROTOCOL=y
-CONFIG_ARM_SCMI_POWER_DOMAIN=y
-CONFIG_ARM_SCPI_PROTOCOL=y
-CONFIG_ARM_SCPI_POWER_DOMAIN=y
-# CONFIG_ARM_SDE_INTERFACE is not set
-# CONFIG_FIRMWARE_MEMMAP is not set
-CONFIG_DMIID=y
-CONFIG_DMI_SYSFS=y
-# CONFIG_ISCSI_IBFT is not set
-# CONFIG_FW_CFG_SYSFS is not set
-CONFIG_ARM_FFA_TRANSPORT=m
-CONFIG_ARM_FFA_SMCCC=y
-# CONFIG_GOOGLE_FIRMWARE is not set
-
-#
-# EFI (Extensible Firmware Interface) Support
-#
-CONFIG_EFI_ESRT=y
-CONFIG_EFI_VARS_PSTORE=y
-CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y
-CONFIG_EFI_PARAMS_FROM_FDT=y
-CONFIG_EFI_RUNTIME_WRAPPERS=y
-CONFIG_EFI_GENERIC_STUB=y
-# CONFIG_EFI_ARMSTUB_DTB_LOADER is not set
-CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y
-CONFIG_EFI_BOOTLOADER_CONTROL=y
-# CONFIG_EFI_CAPSULE_LOADER is not set
-# CONFIG_EFI_TEST is not set
-# CONFIG_RESET_ATTACK_MITIGATION is not set
-# CONFIG_EFI_DISABLE_PCI_DMA is not set
-# end of EFI (Extensible Firmware Interface) Support
-
-CONFIG_EFI_EARLYCON=y
-CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y
-CONFIG_ARM_PSCI_FW=y
-# CONFIG_ARM_PSCI_CHECKER is not set
-CONFIG_HAVE_ARM_SMCCC=y
-CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y
-CONFIG_ARM_SMCCC_SOC_ID=y
-
-#
-# Tegra firmware driver
-#
-# end of Tegra firmware driver
-# end of Firmware Drivers
-
CONFIG_ARCH_SUPPORTS_ACPI=y
CONFIG_ACPI=y
CONFIG_ACPI_GENERIC_GSI=y
@@ -672,13 +635,14 @@ CONFIG_ACPI_REDUCED_HARDWARE_ONLY=y
CONFIG_HAVE_ACPI_APEI=y
# CONFIG_ACPI_APEI is not set
CONFIG_ACPI_CONFIGFS=m
+# CONFIG_ACPI_PFRUT is not set
CONFIG_ACPI_IORT=y
CONFIG_ACPI_GTDT=y
CONFIG_ACPI_PPTT=y
+CONFIG_ACPI_PCC=y
CONFIG_PMIC_OPREGION=y
CONFIG_IRQ_BYPASS_MANAGER=y
-CONFIG_VIRTUALIZATION=y
-CONFIG_KVM=y
+CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_IRQFD=y
CONFIG_HAVE_KVM_IRQ_ROUTING=y
@@ -691,6 +655,10 @@ CONFIG_HAVE_KVM_ARCH_TLB_FLUSH_ALL=y
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
CONFIG_HAVE_KVM_IRQ_BYPASS=y
CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE=y
+CONFIG_KVM_XFER_TO_GUEST_WORK=y
+CONFIG_VIRTUALIZATION=y
+CONFIG_KVM=y
+# CONFIG_NVHE_EL2_DEBUG is not set
CONFIG_ARM64_CRYPTO=y
CONFIG_CRYPTO_SHA256_ARM64=y
CONFIG_CRYPTO_SHA512_ARM64=y
@@ -724,8 +692,10 @@ CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_KRETPROBES=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
+CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y
CONFIG_HAVE_NMI=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_HAVE_ARCH_TRACEHOOK=y
CONFIG_HAVE_DMA_CONTIGUOUS=y
CONFIG_GENERIC_SMP_IDLE_THREAD=y
@@ -780,6 +750,8 @@ CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
CONFIG_ARCH_MMAP_RND_BITS=18
CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y
CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11
+CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
+CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y
CONFIG_CLONE_BACKWARDS=y
CONFIG_OLD_SIGSUSPEND3=y
@@ -799,7 +771,6 @@ CONFIG_ARCH_USE_MEMREMAP_PROT=y
# CONFIG_LOCK_EVENT_COUNTS is not set
CONFIG_ARCH_HAS_RELR=y
CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y
-CONFIG_HAVE_ARCH_PFN_VALID=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
#
@@ -811,7 +782,6 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
CONFIG_HAVE_GCC_PLUGINS=y
CONFIG_GCC_PLUGINS=y
-# CONFIG_GCC_PLUGIN_CYC_COMPLEXITY is not set
# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set
# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set
# end of General architecture-dependent options
@@ -829,21 +799,21 @@ CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_COMPRESS_GZIP=y
# CONFIG_MODULE_COMPRESS_XZ is not set
# CONFIG_MODULE_COMPRESS_ZSTD is not set
+# CONFIG_MODULE_DECOMPRESS is not set
# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
CONFIG_MODPROBE_PATH="/sbin/modprobe"
# CONFIG_TRIM_UNUSED_KSYMS is not set
CONFIG_MODULES_TREE_LOOKUP=y
CONFIG_BLOCK=y
-CONFIG_BLK_SCSI_REQUEST=y
CONFIG_BLK_CGROUP_RWSTAT=y
-CONFIG_BLK_DEV_BSG=y
+CONFIG_BLK_DEV_BSG_COMMON=y
+CONFIG_BLK_ICQ=y
CONFIG_BLK_DEV_BSGLIB=y
CONFIG_BLK_DEV_INTEGRITY=y
CONFIG_BLK_DEV_INTEGRITY_T10=y
CONFIG_BLK_DEV_ZONED=y
CONFIG_BLK_DEV_THROTTLING=y
# CONFIG_BLK_DEV_THROTTLING_LOW is not set
-CONFIG_BLK_CMDLINE_PARSER=y
CONFIG_BLK_WBT=y
CONFIG_BLK_WBT_MQ=y
# CONFIG_BLK_CGROUP_IOLATENCY is not set
@@ -884,6 +854,7 @@ CONFIG_BLOCK_COMPAT=y
CONFIG_BLK_MQ_PCI=y
CONFIG_BLK_MQ_VIRTIO=y
CONFIG_BLK_PM=y
+CONFIG_BLOCK_HOLDER_DEPRECATED=y
#
# IO Schedulers
@@ -986,6 +957,7 @@ CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_HAVE_FAST_GUP=y
CONFIG_ARCH_KEEP_MEMBLOCK=y
CONFIG_MEMORY_ISOLATION=y
+CONFIG_EXCLUSIVE_SYSTEM_RAM=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
# CONFIG_MEMORY_HOTPLUG is not set
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
@@ -1005,7 +977,6 @@ CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
# CONFIG_MEMORY_FAILURE is not set
# CONFIG_TRANSPARENT_HUGEPAGE is not set
-CONFIG_CLEANCACHE=y
CONFIG_FRONTSWAP=y
CONFIG_CMA=y
# CONFIG_CMA_DEBUG is not set
@@ -1043,6 +1014,13 @@ CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y
# CONFIG_GUP_TEST is not set
CONFIG_ARCH_HAS_PTE_SPECIAL=y
CONFIG_SECRETMEM=y
+# CONFIG_ANON_VMA_NAME is not set
+
+#
+# Data Access Monitoring
+#
+# CONFIG_DAMON is not set
+# end of Data Access Monitoring
# end of Memory Management options
CONFIG_NET=y
@@ -1059,6 +1037,7 @@ CONFIG_PACKET=y
CONFIG_PACKET_DIAG=m
CONFIG_UNIX=y
CONFIG_UNIX_SCM=y
+CONFIG_AF_UNIX_OOB=y
CONFIG_UNIX_DIAG=m
CONFIG_TLS=m
# CONFIG_TLS_DEVICE is not set
@@ -1163,6 +1142,7 @@ CONFIG_IPV6_SEG6_LWTUNNEL=y
CONFIG_IPV6_SEG6_HMAC=y
CONFIG_IPV6_SEG6_BPF=y
# CONFIG_IPV6_RPL_LWTUNNEL is not set
+# CONFIG_IPV6_IOAM6_LWTUNNEL is not set
CONFIG_NETLABEL=y
CONFIG_MPTCP=y
CONFIG_INET_MPTCP_DIAG=m
@@ -1178,6 +1158,8 @@ CONFIG_BRIDGE_NETFILTER=m
# Core Netfilter Configuration
#
CONFIG_NETFILTER_INGRESS=y
+CONFIG_NETFILTER_EGRESS=y
+CONFIG_NETFILTER_SKIP_EGRESS=y
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_FAMILY_BRIDGE=y
CONFIG_NETFILTER_FAMILY_ARP=y
@@ -1230,7 +1212,6 @@ CONFIG_NF_TABLES_NETDEV=y
CONFIG_NFT_NUMGEN=m
CONFIG_NFT_CT=m
CONFIG_NFT_FLOW_OFFLOAD=m
-CONFIG_NFT_COUNTER=m
CONFIG_NFT_CONNLIMIT=m
CONFIG_NFT_LOG=m
CONFIG_NFT_LIMIT=m
@@ -1428,7 +1409,6 @@ CONFIG_NFT_REJECT_IPV4=m
CONFIG_NFT_DUP_IPV4=m
CONFIG_NFT_FIB_IPV4=m
CONFIG_NF_TABLES_ARP=y
-CONFIG_NF_FLOW_TABLE_IPV4=m
CONFIG_NF_DUP_IPV4=m
CONFIG_NF_LOG_ARP=m
CONFIG_NF_LOG_IPV4=m
@@ -1468,7 +1448,6 @@ CONFIG_NF_TABLES_IPV6=y
CONFIG_NFT_REJECT_IPV6=m
CONFIG_NFT_DUP_IPV6=m
CONFIG_NFT_FIB_IPV6=m
-CONFIG_NF_FLOW_TABLE_IPV6=m
CONFIG_NF_DUP_IPV6=m
CONFIG_NF_REJECT_IPV6=m
CONFIG_NF_LOG_IPV6=m
@@ -1589,8 +1568,11 @@ CONFIG_NET_DSA_TAG_DSA=m
CONFIG_NET_DSA_TAG_EDSA=m
# CONFIG_NET_DSA_TAG_MTK is not set
# CONFIG_NET_DSA_TAG_KSZ is not set
-# CONFIG_NET_DSA_TAG_RTL4_A is not set
+# CONFIG_NET_DSA_TAG_OCELOT is not set
+# CONFIG_NET_DSA_TAG_OCELOT_8021Q is not set
CONFIG_NET_DSA_TAG_QCA=m
+# CONFIG_NET_DSA_TAG_RTL4_A is not set
+# CONFIG_NET_DSA_TAG_RTL8_4 is not set
# CONFIG_NET_DSA_TAG_LAN9303 is not set
# CONFIG_NET_DSA_TAG_SJA1105 is not set
CONFIG_NET_DSA_TAG_TRAILER=m
@@ -1921,6 +1903,7 @@ CONFIG_BT_HCIRSI=m
# CONFIG_AF_RXRPC is not set
# CONFIG_AF_KCM is not set
CONFIG_STREAM_PARSER=y
+# CONFIG_MCTP is not set
CONFIG_FIB_RULES=y
CONFIG_WIRELESS=y
CONFIG_WIRELESS_EXT=y
@@ -1960,6 +1943,7 @@ CONFIG_RFKILL_LEDS=y
CONFIG_RFKILL_INPUT=y
CONFIG_RFKILL_GPIO=m
CONFIG_NET_9P=m
+CONFIG_NET_9P_FD=m
CONFIG_NET_9P_VIRTIO=m
# CONFIG_NET_9P_DEBUG is not set
# CONFIG_CAIF is not set
@@ -2127,6 +2111,7 @@ CONFIG_AUXILIARY_BUS=y
# CONFIG_UEVENT_HELPER is not set
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_DEVTMPFS_SAFE is not set
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
@@ -2170,7 +2155,6 @@ CONFIG_ARM_CCI=y
CONFIG_ARM_CCI400_COMMON=y
# CONFIG_BRCMSTB_GISB_ARB is not set
# CONFIG_MOXTET is not set
-CONFIG_SIMPLE_PM_BUS=y
CONFIG_SUN50I_DE2_BUS=y
CONFIG_SUNXI_RSB=y
CONFIG_VEXPRESS_CONFIG=y
@@ -2181,11 +2165,75 @@ CONFIG_FSL_MC_BUS=y
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
+
+#
+# Firmware Drivers
+#
+
+#
+# ARM System Control and Management Interface Protocol
+#
+CONFIG_ARM_SCMI_PROTOCOL=y
+CONFIG_ARM_SCMI_HAVE_TRANSPORT=y
+CONFIG_ARM_SCMI_HAVE_SHMEM=y
+CONFIG_ARM_SCMI_TRANSPORT_MAILBOX=y
+CONFIG_ARM_SCMI_TRANSPORT_SMC=y
+# CONFIG_ARM_SCMI_TRANSPORT_VIRTIO is not set
+CONFIG_ARM_SCMI_POWER_DOMAIN=y
+# end of ARM System Control and Management Interface Protocol
+
+CONFIG_ARM_SCPI_PROTOCOL=y
+CONFIG_ARM_SCPI_POWER_DOMAIN=y
+# CONFIG_ARM_SDE_INTERFACE is not set
+# CONFIG_FIRMWARE_MEMMAP is not set
+CONFIG_DMIID=y
+CONFIG_DMI_SYSFS=y
+# CONFIG_ISCSI_IBFT is not set
+# CONFIG_FW_CFG_SYSFS is not set
+CONFIG_SYSFB=y
+# CONFIG_SYSFB_SIMPLEFB is not set
+CONFIG_ARM_FFA_TRANSPORT=m
+CONFIG_ARM_FFA_SMCCC=y
+# CONFIG_GOOGLE_FIRMWARE is not set
+
+#
+# EFI (Extensible Firmware Interface) Support
+#
+CONFIG_EFI_ESRT=y
+CONFIG_EFI_VARS_PSTORE=y
+CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y
+CONFIG_EFI_PARAMS_FROM_FDT=y
+CONFIG_EFI_RUNTIME_WRAPPERS=y
+CONFIG_EFI_GENERIC_STUB=y
+# CONFIG_EFI_ARMSTUB_DTB_LOADER is not set
+CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y
+CONFIG_EFI_BOOTLOADER_CONTROL=y
+# CONFIG_EFI_CAPSULE_LOADER is not set
+# CONFIG_EFI_TEST is not set
+# CONFIG_RESET_ATTACK_MITIGATION is not set
+# CONFIG_EFI_DISABLE_PCI_DMA is not set
+# end of EFI (Extensible Firmware Interface) Support
+
+CONFIG_EFI_EARLYCON=y
+CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y
+CONFIG_ARM_PSCI_FW=y
+# CONFIG_ARM_PSCI_CHECKER is not set
+CONFIG_HAVE_ARM_SMCCC=y
+CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y
+CONFIG_ARM_SMCCC_SOC_ID=y
+
+#
+# Tegra firmware driver
+#
+# end of Tegra firmware driver
+# end of Firmware Drivers
+
CONFIG_GNSS=m
CONFIG_GNSS_SERIAL=m
CONFIG_GNSS_MTK_SERIAL=m
# CONFIG_GNSS_SIRF_SERIAL is not set
# CONFIG_GNSS_UBX_SERIAL is not set
+# CONFIG_GNSS_USB is not set
CONFIG_MTD=y
# CONFIG_MTD_TESTS is not set
@@ -2205,6 +2253,10 @@ CONFIG_MTD_OF_PARTS=m
CONFIG_MTD_BLKDEVS=m
CONFIG_MTD_BLOCK=m
# CONFIG_MTD_BLOCK_RO is not set
+
+#
+# Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK.
+#
# CONFIG_FTL is not set
# CONFIG_NFTL is not set
# CONFIG_INFTL is not set
@@ -2336,7 +2388,6 @@ CONFIG_OF_KOBJ=y
CONFIG_OF_DYNAMIC=y
CONFIG_OF_ADDRESS=y
CONFIG_OF_IRQ=y
-CONFIG_OF_NET=y
CONFIG_OF_RESERVED_MEM=y
CONFIG_OF_RESOLVE=y
CONFIG_OF_OVERLAY=y
@@ -2364,7 +2415,6 @@ CONFIG_ZRAM_DEF_COMP="lzo-rle"
# CONFIG_ZRAM_MEMORY_TRACKING is not set
CONFIG_BLK_DEV_LOOP=m
CONFIG_BLK_DEV_LOOP_MIN_COUNT=0
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
CONFIG_BLK_DEV_DRBD=m
# CONFIG_DRBD_FAULT_INJECTION is not set
CONFIG_BLK_DEV_NBD=m
@@ -2378,7 +2428,6 @@ CONFIG_CDROM_PKTCDVD_BUFFERS=8
CONFIG_ATA_OVER_ETH=m
CONFIG_VIRTIO_BLK=y
CONFIG_BLK_DEV_RBD=m
-# CONFIG_BLK_DEV_RSXX is not set
#
# NVME Support
@@ -2403,6 +2452,7 @@ CONFIG_TIFM_CORE=y
CONFIG_TIFM_7XX1=m
# CONFIG_ICS932S401 is not set
CONFIG_ENCLOSURE_SERVICES=m
+# CONFIG_HI6421V600_IRQ is not set
# CONFIG_HP_ILO is not set
CONFIG_APDS9802ALS=m
CONFIG_ISL29003=m
@@ -2461,6 +2511,7 @@ CONFIG_UACCE=m
#
CONFIG_SCSI_MOD=y
CONFIG_RAID_ATTRS=m
+CONFIG_SCSI_COMMON=y
CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
CONFIG_SCSI_NETLINK=y
@@ -2473,6 +2524,7 @@ CONFIG_BLK_DEV_SD=y
CONFIG_CHR_DEV_ST=m
CONFIG_BLK_DEV_SR=y
CONFIG_CHR_DEV_SG=y
+CONFIG_BLK_DEV_BSG=y
CONFIG_CHR_DEV_SCH=m
CONFIG_SCSI_ENCLOSURE=m
CONFIG_SCSI_CONSTANTS=y
@@ -2535,6 +2587,8 @@ CONFIG_SCSI_UFSHCD_PLATFORM=y
# CONFIG_SCSI_UFS_CDNS_PLATFORM is not set
# CONFIG_SCSI_UFS_DWC_TC_PLATFORM is not set
# CONFIG_SCSI_UFS_BSG is not set
+# CONFIG_SCSI_UFS_HPB is not set
+# CONFIG_SCSI_UFS_HWMON is not set
CONFIG_SCSI_HPTIOP=m
# CONFIG_SCSI_MYRB is not set
# CONFIG_SCSI_MYRS is not set
@@ -2736,6 +2790,7 @@ CONFIG_DM_SWITCH=m
CONFIG_DM_LOG_WRITES=m
CONFIG_DM_INTEGRITY=m
CONFIG_DM_ZONED=m
+CONFIG_DM_AUDIT=y
CONFIG_TARGET_CORE=m
CONFIG_TCM_IBLOCK=m
CONFIG_TCM_FILEIO=m
@@ -2778,6 +2833,7 @@ CONFIG_VXLAN=m
CONFIG_GENEVE=m
# CONFIG_BAREUDP is not set
# CONFIG_GTP is not set
+# CONFIG_AMT is not set
# CONFIG_MACSEC is not set
CONFIG_NETCONSOLE=m
CONFIG_NETCONSOLE_DYNAMIC=y
@@ -2820,7 +2876,7 @@ CONFIG_NET_DSA_MV88E6XXX_PTP=y
# CONFIG_NET_DSA_XRS700X_I2C is not set
# CONFIG_NET_DSA_XRS700X_MDIO is not set
CONFIG_NET_DSA_QCA8K=m
-# CONFIG_NET_DSA_REALTEK_SMI is not set
+# CONFIG_NET_DSA_REALTEK is not set
# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set
# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set
# CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set
@@ -2851,6 +2907,8 @@ CONFIG_AMD_XGBE=m
CONFIG_NET_VENDOR_AQUANTIA=y
CONFIG_AQTION=m
CONFIG_NET_VENDOR_ARC=y
+CONFIG_NET_VENDOR_ASIX=y
+# CONFIG_SPI_AX88796C is not set
CONFIG_NET_VENDOR_ATHEROS=y
CONFIG_ATL2=m
CONFIG_ATL1=m
@@ -2871,7 +2929,6 @@ CONFIG_BNX2X=m
CONFIG_BNX2X_SRIOV=y
# CONFIG_SYSTEMPORT is not set
# CONFIG_BNXT is not set
-# CONFIG_NET_VENDOR_BROCADE is not set
CONFIG_NET_VENDOR_CADENCE=y
CONFIG_MACB=m
CONFIG_MACB_USE_HWSTAMP=y
@@ -2888,6 +2945,8 @@ CONFIG_DL2K=m
CONFIG_SUNDANCE=m
# CONFIG_SUNDANCE_MMIO is not set
# CONFIG_NET_VENDOR_EMULEX is not set
+CONFIG_NET_VENDOR_ENGLEDER=y
+# CONFIG_TSNEP is not set
# CONFIG_NET_VENDOR_EZCHIP is not set
CONFIG_NET_VENDOR_FREESCALE=y
CONFIG_FSL_FMAN=m
@@ -2938,8 +2997,9 @@ CONFIG_I40EVF=m
# CONFIG_ICE is not set
CONFIG_FM10K=m
# CONFIG_IGC is not set
-CONFIG_NET_VENDOR_MICROSOFT=y
CONFIG_JME=m
+CONFIG_NET_VENDOR_LITEX=y
+# CONFIG_LITEX_LITEETH is not set
CONFIG_NET_VENDOR_MARVELL=y
CONFIG_MVMDIO=m
CONFIG_SKGE=m
@@ -2978,11 +3038,15 @@ CONFIG_NET_VENDOR_MICROCHIP=y
# CONFIG_ENC28J60 is not set
# CONFIG_ENCX24J600 is not set
# CONFIG_LAN743X is not set
+# CONFIG_LAN966X_SWITCH is not set
CONFIG_NET_VENDOR_MICROSEMI=y
# CONFIG_MSCC_OCELOT_SWITCH is not set
+CONFIG_NET_VENDOR_MICROSOFT=y
CONFIG_NET_VENDOR_MYRI=y
CONFIG_MYRI10GE=m
CONFIG_FEALNX=m
+CONFIG_NET_VENDOR_NI=y
+# CONFIG_NI_XGE_MANAGEMENT_ENET is not set
CONFIG_NET_VENDOR_NATSEMI=y
CONFIG_NATSEMI=m
CONFIG_NS83820=m
@@ -2991,8 +3055,6 @@ CONFIG_NET_VENDOR_NETERION=y
# CONFIG_VXGE is not set
CONFIG_NET_VENDOR_NETRONOME=y
# CONFIG_NFP is not set
-CONFIG_NET_VENDOR_NI=y
-# CONFIG_NI_XGE_MANAGEMENT_ENET is not set
CONFIG_NET_VENDOR_8390=y
CONFIG_NE2K_PCI=m
CONFIG_NET_VENDOR_NVIDIA=y
@@ -3005,6 +3067,7 @@ CONFIG_YELLOWFIN=m
CONFIG_NET_VENDOR_PENSANDO=y
# CONFIG_IONIC is not set
# CONFIG_NET_VENDOR_QLOGIC is not set
+# CONFIG_NET_VENDOR_BROCADE is not set
CONFIG_NET_VENDOR_QUALCOMM=y
# CONFIG_QCA7000_SPI is not set
# CONFIG_QCA7000_UART is not set
@@ -3025,14 +3088,14 @@ CONFIG_NET_VENDOR_ROCKER=y
CONFIG_ROCKER=m
# CONFIG_NET_VENDOR_SAMSUNG is not set
# CONFIG_NET_VENDOR_SEEQ is not set
-CONFIG_NET_VENDOR_SOLARFLARE=y
-# CONFIG_SFC is not set
-# CONFIG_SFC_FALCON is not set
CONFIG_NET_VENDOR_SILAN=y
CONFIG_SC92031=m
CONFIG_NET_VENDOR_SIS=y
CONFIG_SIS900=m
CONFIG_SIS190=m
+CONFIG_NET_VENDOR_SOLARFLARE=y
+# CONFIG_SFC is not set
+# CONFIG_SFC_FALCON is not set
CONFIG_NET_VENDOR_SMSC=y
CONFIG_SMC91X=m
CONFIG_EPIC100=m
@@ -3058,6 +3121,8 @@ CONFIG_TEHUTI=m
CONFIG_NET_VENDOR_TI=y
# CONFIG_TI_CPSW_PHY_SEL is not set
# CONFIG_TLAN is not set
+CONFIG_NET_VENDOR_VERTEXCOM=y
+# CONFIG_MSE102X is not set
CONFIG_NET_VENDOR_VIA=y
CONFIG_VIA_RHINE=m
CONFIG_VIA_RHINE_MMIO=y
@@ -3101,6 +3166,7 @@ CONFIG_LSI_ET1011C_PHY=m
CONFIG_MARVELL_PHY=m
CONFIG_MARVELL_10G_PHY=m
# CONFIG_MARVELL_88X2222_PHY is not set
+# CONFIG_MAXLINEAR_GPHY is not set
# CONFIG_MEDIATEK_GE_PHY is not set
CONFIG_MICREL_PHY=m
CONFIG_MICROCHIP_PHY=m
@@ -3311,6 +3377,7 @@ CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
# CONFIG_B43LEGACY_PIO_MODE is not set
CONFIG_BRCMUTIL=m
CONFIG_BRCMSMAC=m
+CONFIG_BRCMSMAC_LEDS=y
CONFIG_BRCMFMAC=m
CONFIG_BRCMFMAC_PROTO_BCDC=y
CONFIG_BRCMFMAC_PROTO_MSGBUF=y
@@ -3348,7 +3415,6 @@ CONFIG_IWLWIFI_LEDS=y
CONFIG_IWLDVM=m
CONFIG_IWLMVM=m
CONFIG_IWLWIFI_OPMODE_MODULAR=y
-# CONFIG_IWLWIFI_BCAST_FILTERING is not set
#
# Debugging Options
@@ -3376,7 +3442,6 @@ CONFIG_P54_USB=m
CONFIG_P54_PCI=m
# CONFIG_P54_SPI is not set
CONFIG_P54_LEDS=y
-CONFIG_PRISM54=m
CONFIG_WLAN_VENDOR_MARVELL=y
CONFIG_LIBERTAS=m
CONFIG_LIBERTAS_USB=m
@@ -3413,6 +3478,7 @@ CONFIG_MT7615E=m
# CONFIG_MT7663S is not set
# CONFIG_MT7915E is not set
# CONFIG_MT7921E is not set
+# CONFIG_MT7921S is not set
CONFIG_WLAN_VENDOR_MICROCHIP=y
# CONFIG_WILC1000_SDIO is not set
# CONFIG_WILC1000_SPI is not set
@@ -3470,6 +3536,7 @@ CONFIG_RTLBTCOEXIST=m
CONFIG_RTL8XXXU=m
# CONFIG_RTL8XXXU_UNTESTED is not set
# CONFIG_RTW88 is not set
+# CONFIG_RTW89 is not set
CONFIG_WLAN_VENDOR_RSI=y
CONFIG_RSI_91X=m
CONFIG_RSI_DEBUGFS=y
@@ -3523,7 +3590,6 @@ CONFIG_IEEE802154_ATUSB=m
# CONFIG_NETDEVSIM is not set
CONFIG_NET_FAILOVER=m
# CONFIG_ISDN is not set
-# CONFIG_NVM is not set
#
# Input device support
@@ -3580,6 +3646,7 @@ CONFIG_KEYBOARD_GPIO_POLLED=m
CONFIG_KEYBOARD_CROS_EC=y
# CONFIG_KEYBOARD_CAP11XX is not set
# CONFIG_KEYBOARD_BCM is not set
+# CONFIG_KEYBOARD_CYPRESS_SF is not set
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
CONFIG_MOUSE_PS2_ALPS=y
@@ -3845,6 +3912,7 @@ CONFIG_SERIAL_8250_DWLIB=y
CONFIG_SERIAL_8250_FSL=y
CONFIG_SERIAL_8250_DW=y
# CONFIG_SERIAL_8250_RT288X is not set
+CONFIG_SERIAL_8250_PERICOM=y
CONFIG_SERIAL_OF_PLATFORM=y
#
@@ -3891,6 +3959,7 @@ CONFIG_NOZOMI=m
# CONFIG_NULL_TTY is not set
CONFIG_HVC_DRIVER=y
# CONFIG_HVC_DCC is not set
+# CONFIG_RPMSG_TTY is not set
CONFIG_SERIAL_DEV_BUS=y
CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
# CONFIG_TTY_PRINTK is not set
@@ -3902,6 +3971,7 @@ CONFIG_IPMI_PLAT_DATA=y
CONFIG_IPMI_DEVICE_INTERFACE=m
CONFIG_IPMI_SI=m
CONFIG_IPMI_SSIF=m
+# CONFIG_IPMI_IPMB is not set
CONFIG_IPMI_WATCHDOG=m
CONFIG_IPMI_POWEROFF=m
# CONFIG_IPMB_DEVICE_INTERFACE is not set
@@ -3909,9 +3979,10 @@ CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_TIMERIOMEM=m
# CONFIG_HW_RANDOM_BA431 is not set
CONFIG_HW_RANDOM_VIRTIO=m
-CONFIG_HW_RANDOM_CAVIUM=y
# CONFIG_HW_RANDOM_CCTRNG is not set
# CONFIG_HW_RANDOM_XIPHERA is not set
+CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=y
+CONFIG_HW_RANDOM_CN10K=y
# CONFIG_APPLICOM is not set
CONFIG_DEVMEM=y
CONFIG_DEVPORT=y
@@ -3931,10 +4002,9 @@ CONFIG_TCG_ATMEL=m
# CONFIG_TCG_TIS_ST33ZP24_SPI is not set
# CONFIG_XILLYBUS is not set
# CONFIG_XILLYUSB is not set
-# end of Character devices
-
# CONFIG_RANDOM_TRUST_CPU is not set
# CONFIG_RANDOM_TRUST_BOOTLOADER is not set
+# end of Character devices
#
# I2C support
@@ -4033,6 +4103,7 @@ CONFIG_I2C_VIPERBOARD=m
# Other I2C/SMBus bus drivers
#
CONFIG_I2C_CROS_EC_TUNNEL=y
+# CONFIG_I2C_VIRTIO is not set
# end of I2C Hardware Bus support
CONFIG_I2C_STUB=m
@@ -4058,6 +4129,7 @@ CONFIG_SPI_MEM=y
CONFIG_SPI_BITBANG=y
# CONFIG_SPI_CADENCE is not set
# CONFIG_SPI_CADENCE_QUADSPI is not set
+# CONFIG_SPI_CADENCE_XSPI is not set
# CONFIG_SPI_DESIGNWARE is not set
# CONFIG_SPI_FSL_QUADSPI is not set
# CONFIG_SPI_HISI_KUNPENG is not set
@@ -4115,6 +4187,7 @@ CONFIG_PPS_CLIENT_GPIO=m
# PTP clock support
#
CONFIG_PTP_1588_CLOCK=y
+CONFIG_PTP_1588_CLOCK_OPTIONAL=y
CONFIG_PTP_1588_CLOCK_QORIQ=m
CONFIG_DP83640_PHY=m
# CONFIG_PTP_1588_CLOCK_INES is not set
@@ -4131,16 +4204,16 @@ CONFIG_GENERIC_PINMUX_FUNCTIONS=y
CONFIG_PINCONF=y
CONFIG_GENERIC_PINCONF=y
# CONFIG_DEBUG_PINCTRL is not set
-CONFIG_PINCTRL_AXP209=y
CONFIG_PINCTRL_AMD=y
+CONFIG_PINCTRL_AXP209=y
+CONFIG_PINCTRL_MAX77620=y
# CONFIG_PINCTRL_MCP23S08 is not set
+# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set
+# CONFIG_PINCTRL_OCELOT is not set
+CONFIG_PINCTRL_RK805=y
CONFIG_PINCTRL_SINGLE=y
-# CONFIG_PINCTRL_SX150X is not set
# CONFIG_PINCTRL_STMFX is not set
-CONFIG_PINCTRL_MAX77620=y
-CONFIG_PINCTRL_RK805=y
-# CONFIG_PINCTRL_OCELOT is not set
-# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set
+# CONFIG_PINCTRL_SX150X is not set
#
# Renesas pinctrl drivers
@@ -4263,6 +4336,8 @@ CONFIG_GPIO_VIPERBOARD=m
#
# CONFIG_GPIO_AGGREGATOR is not set
# CONFIG_GPIO_MOCKUP is not set
+# CONFIG_GPIO_VIRTIO is not set
+# CONFIG_GPIO_SIM is not set
# end of Virtual GPIO drivers
CONFIG_W1=m
@@ -4336,7 +4411,6 @@ CONFIG_MANAGER_SBS=m
CONFIG_CHARGER_AXP20X=m
CONFIG_BATTERY_AXP20X=m
CONFIG_AXP20X_POWER=m
-# CONFIG_AXP288_FUEL_GAUGE is not set
# CONFIG_BATTERY_MAX17040 is not set
CONFIG_BATTERY_MAX17042=m
# CONFIG_BATTERY_MAX1721X is not set
@@ -4348,6 +4422,7 @@ CONFIG_BATTERY_MAX17042=m
# CONFIG_CHARGER_LT3651 is not set
# CONFIG_CHARGER_LTC4162L is not set
# CONFIG_CHARGER_DETECTOR_MAX14656 is not set
+# CONFIG_CHARGER_MAX77976 is not set
# CONFIG_CHARGER_BQ2415X is not set
# CONFIG_CHARGER_BQ24190 is not set
# CONFIG_CHARGER_BQ24257 is not set
@@ -4362,6 +4437,7 @@ CONFIG_CHARGER_SMB347=m
# CONFIG_BATTERY_RT5033 is not set
# CONFIG_CHARGER_RT9455 is not set
CONFIG_CHARGER_CROS_USBPD=m
+CONFIG_CHARGER_CROS_PCHG=y
# CONFIG_CHARGER_UCS1002 is not set
# CONFIG_CHARGER_BD99954 is not set
CONFIG_HWMON=y
@@ -4389,6 +4465,7 @@ CONFIG_SENSORS_ADT7462=m
CONFIG_SENSORS_ADT7470=m
CONFIG_SENSORS_ADT7475=m
# CONFIG_SENSORS_AHT10 is not set
+# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set
# CONFIG_SENSORS_AS370 is not set
CONFIG_SENSORS_ASC7621=m
# CONFIG_SENSORS_AXI_FAN_CONTROL is not set
@@ -4438,6 +4515,7 @@ CONFIG_SENSORS_MAX1668=m
CONFIG_SENSORS_MAX197=m
# CONFIG_SENSORS_MAX31722 is not set
# CONFIG_SENSORS_MAX31730 is not set
+# CONFIG_SENSORS_MAX6620 is not set
# CONFIG_SENSORS_MAX6621 is not set
CONFIG_SENSORS_MAX6639=m
CONFIG_SENSORS_MAX6642=m
@@ -4474,6 +4552,7 @@ CONFIG_SENSORS_NCT7802=m
CONFIG_SENSORS_NCT7904=m
# CONFIG_SENSORS_NPCM7XX is not set
# CONFIG_SENSORS_NZXT_KRAKEN2 is not set
+# CONFIG_SENSORS_NZXT_SMART2 is not set
# CONFIG_SENSORS_OCC_P8_I2C is not set
CONFIG_SENSORS_PCF8591=m
CONFIG_PMBUS=m
@@ -4482,6 +4561,7 @@ CONFIG_SENSORS_PMBUS=m
CONFIG_SENSORS_ADM1275=m
# CONFIG_SENSORS_BEL_PFE is not set
# CONFIG_SENSORS_BPA_RS600 is not set
+# CONFIG_SENSORS_DELTA_AHE50DC_FAN is not set
# CONFIG_SENSORS_FSP_3Y is not set
# CONFIG_SENSORS_IBM_CFFPS is not set
# CONFIG_SENSORS_DPS920AB is not set
@@ -4505,6 +4585,7 @@ CONFIG_SENSORS_MAX34440=m
CONFIG_SENSORS_MAX8688=m
# CONFIG_SENSORS_MP2888 is not set
# CONFIG_SENSORS_MP2975 is not set
+# CONFIG_SENSORS_MP5023 is not set
# CONFIG_SENSORS_PIM4328 is not set
# CONFIG_SENSORS_PM6764TR is not set
# CONFIG_SENSORS_PXE1610 is not set
@@ -4519,6 +4600,7 @@ CONFIG_SENSORS_ZL6100=m
CONFIG_SENSORS_PWM_FAN=m
CONFIG_SENSORS_SL28CPLD=m
# CONFIG_SENSORS_SBTSI is not set
+# CONFIG_SENSORS_SBRMI is not set
CONFIG_SENSORS_SHT15=m
CONFIG_SENSORS_SHT21=m
CONFIG_SENSORS_SHT3x=m
@@ -4543,6 +4625,7 @@ CONFIG_SENSORS_ADS7828=m
CONFIG_SENSORS_AMC6821=m
CONFIG_SENSORS_INA209=m
CONFIG_SENSORS_INA2XX=m
+# CONFIG_SENSORS_INA238 is not set
CONFIG_SENSORS_INA3221=m
CONFIG_SENSORS_TC74=m
CONFIG_SENSORS_THMC50=m
@@ -4700,11 +4783,11 @@ CONFIG_MFD_CROS_EC_DEV=y
# CONFIG_MFD_MC13XXX_I2C is not set
# CONFIG_MFD_MP2629 is not set
# CONFIG_MFD_HI6421_PMIC is not set
+# CONFIG_MFD_HI6421_SPMI is not set
# CONFIG_HTC_PASIC3 is not set
# CONFIG_HTC_I2CPLD is not set
# CONFIG_LPC_ICH is not set
# CONFIG_LPC_SCH is not set
-# CONFIG_MFD_INTEL_PMT is not set
# CONFIG_MFD_IQS62X is not set
# CONFIG_MFD_JANZ_CMODIO is not set
# CONFIG_MFD_KEMPLD is not set
@@ -4765,7 +4848,6 @@ CONFIG_MFD_SYSCON=y
# CONFIG_MFD_TPS65910 is not set
# CONFIG_MFD_TPS65912_I2C is not set
# CONFIG_MFD_TPS65912_SPI is not set
-# CONFIG_MFD_TPS80031 is not set
# CONFIG_TWL4030_CORE is not set
# CONFIG_TWL6040_CORE is not set
CONFIG_MFD_WL1273_CORE=m
@@ -4782,7 +4864,6 @@ CONFIG_MFD_VX855=m
# CONFIG_MFD_WM8350_I2C is not set
# CONFIG_MFD_WM8994 is not set
CONFIG_MFD_ROHM_BD718XX=y
-# CONFIG_MFD_ROHM_BD70528 is not set
# CONFIG_MFD_ROHM_BD71828 is not set
# CONFIG_MFD_ROHM_BD957XMUF is not set
# CONFIG_MFD_STPMIC1 is not set
@@ -4793,6 +4874,8 @@ CONFIG_MFD_WCD934X=m
CONFIG_MFD_VEXPRESS_SYSREG=y
# CONFIG_RAVE_SP_CORE is not set
# CONFIG_MFD_INTEL_M10_BMC is not set
+# CONFIG_MFD_RSMU_I2C is not set
+# CONFIG_MFD_RSMU_SPI is not set
# end of Multifunction device drivers
CONFIG_REGULATOR=y
@@ -4828,6 +4911,7 @@ CONFIG_REGULATOR_MAX77620=y
# CONFIG_REGULATOR_MAX8893 is not set
# CONFIG_REGULATOR_MAX8952 is not set
# CONFIG_REGULATOR_MAX8973 is not set
+# CONFIG_REGULATOR_MAX20086 is not set
# CONFIG_REGULATOR_MAX77826 is not set
# CONFIG_REGULATOR_MCP16502 is not set
# CONFIG_REGULATOR_MP5416 is not set
@@ -4851,7 +4935,9 @@ CONFIG_REGULATOR_ROHM=y
# CONFIG_REGULATOR_RT4801 is not set
# CONFIG_REGULATOR_RT6160 is not set
# CONFIG_REGULATOR_RT6245 is not set
+# CONFIG_REGULATOR_RTQ2134 is not set
# CONFIG_REGULATOR_RTMV20 is not set
+# CONFIG_REGULATOR_RTQ6752 is not set
# CONFIG_REGULATOR_S2MPA01 is not set
CONFIG_REGULATOR_S2MPS11=y
# CONFIG_REGULATOR_S5M8767 is not set
@@ -4906,12 +4992,15 @@ CONFIG_IR_PWM_TX=m
CONFIG_IR_SUNXI=m
CONFIG_IR_SERIAL=m
CONFIG_IR_SERIAL_TRANSMITTER=y
-CONFIG_IR_SIR=m
# CONFIG_RC_XBOX_DVD is not set
CONFIG_IR_TOY=m
CONFIG_CEC_CORE=m
CONFIG_CEC_NOTIFIER=y
CONFIG_CEC_PIN=y
+
+#
+# CEC support
+#
CONFIG_MEDIA_CEC_RC=y
# CONFIG_CEC_PIN_ERROR_INJ is not set
CONFIG_MEDIA_CEC_SUPPORT=y
@@ -4919,6 +5008,8 @@ CONFIG_CEC_CH7322=m
CONFIG_CEC_CROS_EC=m
CONFIG_USB_PULSE8_CEC=m
CONFIG_USB_RAINSHADOW_CEC=m
+# end of CEC support
+
CONFIG_MEDIA_SUPPORT=m
# CONFIG_MEDIA_SUPPORT_FILTER is not set
CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
@@ -4952,6 +5043,8 @@ CONFIG_VIDEO_V4L2_SUBDEV_API=y
# CONFIG_VIDEO_ADV_DEBUG is not set
# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
CONFIG_VIDEO_TUNER=m
+CONFIG_V4L2_H264=m
+CONFIG_V4L2_VP9=m
CONFIG_V4L2_MEM2MEM_DEV=m
# CONFIG_V4L2_FLASH_LED_CLASS is not set
CONFIG_V4L2_FWNODE=m
@@ -4966,10 +5059,6 @@ CONFIG_VIDEOBUF_VMALLOC=m
#
CONFIG_MEDIA_CONTROLLER_DVB=y
CONFIG_MEDIA_CONTROLLER_REQUEST_API=y
-
-#
-# Please notice that the enabled Media controller Request API is EXPERIMENTAL
-#
# end of Media controller options
#
@@ -5268,7 +5357,6 @@ CONFIG_V4L_PLATFORM_DRIVERS=y
CONFIG_VIDEO_SUN6I_CSI=m
CONFIG_V4L_MEM2MEM_DRIVERS=y
# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set
-CONFIG_VIDEO_SUN50I_DEINTERLACE=m
CONFIG_VIDEO_SUN8I_DEINTERLACE=m
# CONFIG_VIDEO_SUN8I_ROTATE is not set
# CONFIG_DVB_PLATFORM_DRIVERS is not set
@@ -5398,6 +5486,7 @@ CONFIG_VIDEO_M52790=m
# Camera sensor devices
#
# CONFIG_VIDEO_HI556 is not set
+# CONFIG_VIDEO_HI846 is not set
# CONFIG_VIDEO_IMX208 is not set
# CONFIG_VIDEO_IMX214 is not set
CONFIG_VIDEO_IMX219=m
@@ -5406,7 +5495,9 @@ CONFIG_VIDEO_IMX219=m
# CONFIG_VIDEO_IMX290 is not set
# CONFIG_VIDEO_IMX319 is not set
# CONFIG_VIDEO_IMX334 is not set
+# CONFIG_VIDEO_IMX335 is not set
# CONFIG_VIDEO_IMX355 is not set
+# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_OV02A10 is not set
CONFIG_VIDEO_OV2640=m
# CONFIG_VIDEO_OV2659 is not set
@@ -5420,6 +5511,7 @@ CONFIG_VIDEO_OV5645=m
# CONFIG_VIDEO_OV6650 is not set
# CONFIG_VIDEO_OV5670 is not set
# CONFIG_VIDEO_OV5675 is not set
+# CONFIG_VIDEO_OV5693 is not set
# CONFIG_VIDEO_OV5695 is not set
# CONFIG_VIDEO_OV7251 is not set
# CONFIG_VIDEO_OV772X is not set
@@ -5428,10 +5520,12 @@ CONFIG_VIDEO_OV7640=m
# CONFIG_VIDEO_OV7740 is not set
# CONFIG_VIDEO_OV8856 is not set
# CONFIG_VIDEO_OV8865 is not set
+# CONFIG_VIDEO_OV9282 is not set
# CONFIG_VIDEO_OV9640 is not set
# CONFIG_VIDEO_OV9650 is not set
# CONFIG_VIDEO_OV9734 is not set
# CONFIG_VIDEO_OV13858 is not set
+# CONFIG_VIDEO_OV13B10 is not set
# CONFIG_VIDEO_VS6624 is not set
# CONFIG_VIDEO_MT9M001 is not set
# CONFIG_VIDEO_MT9M032 is not set
@@ -5709,10 +5803,12 @@ CONFIG_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=16
CONFIG_DRM=m
CONFIG_DRM_MIPI_DSI=y
+CONFIG_DRM_DP_AUX_BUS=m
# CONFIG_DRM_DP_AUX_CHARDEV is not set
# CONFIG_DRM_DEBUG_SELFTEST is not set
CONFIG_DRM_KMS_HELPER=m
# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set
+# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
CONFIG_DRM_FBDEV_EMULATION=y
CONFIG_DRM_FBDEV_OVERALLOC=100
# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set
@@ -5721,9 +5817,8 @@ CONFIG_DRM_LOAD_EDID_FIRMWARE=y
CONFIG_DRM_TTM=m
CONFIG_DRM_VRAM_HELPER=m
CONFIG_DRM_TTM_HELPER=m
-CONFIG_DRM_GEM_CMA_HELPER=y
-CONFIG_DRM_KMS_CMA_HELPER=y
-CONFIG_DRM_GEM_SHMEM_HELPER=y
+CONFIG_DRM_GEM_CMA_HELPER=m
+CONFIG_DRM_GEM_SHMEM_HELPER=m
CONFIG_DRM_SCHED=m
#
@@ -5755,7 +5850,8 @@ CONFIG_DRM_UDL=m
CONFIG_DRM_AST=m
CONFIG_DRM_MGAG200=m
# CONFIG_DRM_RCAR_DW_HDMI is not set
-# CONFIG_DRM_RCAR_LVDS is not set
+# CONFIG_DRM_RCAR_USE_LVDS is not set
+# CONFIG_DRM_RCAR_MIPI_DSI is not set
CONFIG_DRM_SUN4I=m
CONFIG_DRM_SUN4I_HDMI=m
CONFIG_DRM_SUN4I_HDMI_CEC=y
@@ -5765,7 +5861,6 @@ CONFIG_DRM_SUN8I_DW_HDMI=m
CONFIG_DRM_SUN8I_MIXER=m
CONFIG_DRM_SUN8I_TCON_TOP=m
CONFIG_DRM_QXL=m
-CONFIG_DRM_BOCHS=m
CONFIG_DRM_VIRTIO_GPU=m
CONFIG_DRM_PANEL=y
@@ -5775,18 +5870,23 @@ CONFIG_DRM_PANEL=y
# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set
# CONFIG_DRM_PANEL_ARM_VERSATILE is not set
# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set
+# CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set
# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set
# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set
# CONFIG_DRM_PANEL_DSI_CM is not set
# CONFIG_DRM_PANEL_LVDS is not set
CONFIG_DRM_PANEL_SIMPLE=m
+# CONFIG_DRM_PANEL_EDP is not set
# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set
# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set
# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set
# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set
+# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set
# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set
+# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set
# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set
# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set
+# CONFIG_DRM_PANEL_JDI_R63452 is not set
# CONFIG_DRM_PANEL_KHADAS_TS050 is not set
# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set
# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set
@@ -5796,6 +5896,7 @@ CONFIG_DRM_PANEL_SIMPLE=m
# CONFIG_DRM_PANEL_LG_LG4573 is not set
# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set
# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set
+# CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set
# CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set
# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set
CONFIG_DRM_PANEL_MANTIX_MLAF057WE51=m
@@ -5807,7 +5908,10 @@ CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m
CONFIG_DRM_PANEL_RAYDIUM_RM67191=m
# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set
# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set
+# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set
+# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set
+# CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set
@@ -5818,17 +5922,20 @@ CONFIG_DRM_PANEL_RAYDIUM_RM67191=m
# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set
# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set
# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set
+# CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set
# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set
CONFIG_DRM_PANEL_SITRONIX_ST7703=m
# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set
# CONFIG_DRM_PANEL_SONY_ACX424AKP is not set
# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set
+# CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set
# CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set
# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set
# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set
# CONFIG_DRM_PANEL_TPO_TPG110 is not set
CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA=m
# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set
+# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set
# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set
# end of Display Panels
@@ -5888,10 +5995,12 @@ CONFIG_DRM_ETNAVIV_THERMAL=y
CONFIG_DRM_MXS=y
CONFIG_DRM_MXSFB=m
# CONFIG_DRM_ARCPGU is not set
+CONFIG_DRM_BOCHS=m
CONFIG_DRM_CIRRUS_QEMU=m
# CONFIG_DRM_GM12U320 is not set
# CONFIG_DRM_SIMPLEDRM is not set
# CONFIG_TINYDRM_HX8357D is not set
+# CONFIG_TINYDRM_ILI9163 is not set
# CONFIG_TINYDRM_ILI9225 is not set
# CONFIG_TINYDRM_ILI9341 is not set
# CONFIG_TINYDRM_ILI9486 is not set
@@ -5911,6 +6020,7 @@ CONFIG_DRM_LEGACY=y
# CONFIG_DRM_VIA is not set
# CONFIG_DRM_SAVAGE is not set
CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y
+CONFIG_DRM_NOMODESET=y
#
# Frame buffer Devices
@@ -6018,6 +6128,7 @@ CONFIG_DUMMY_CONSOLE=y
CONFIG_DUMMY_CONSOLE_COLUMNS=80
CONFIG_DUMMY_CONSOLE_ROWS=25
CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set
@@ -6159,12 +6270,15 @@ CONFIG_SND_HDA_RECONFIG=y
CONFIG_SND_HDA_INPUT_BEEP=y
CONFIG_SND_HDA_INPUT_BEEP_MODE=0
CONFIG_SND_HDA_PATCH_LOADER=y
+# CONFIG_SND_HDA_SCODEC_CS35L41_I2C is not set
+# CONFIG_SND_HDA_SCODEC_CS35L41_SPI is not set
CONFIG_SND_HDA_CODEC_REALTEK=m
CONFIG_SND_HDA_CODEC_ANALOG=m
CONFIG_SND_HDA_CODEC_SIGMATEL=m
CONFIG_SND_HDA_CODEC_VIA=m
CONFIG_SND_HDA_CODEC_HDMI=m
CONFIG_SND_HDA_CODEC_CIRRUS=m
+# CONFIG_SND_HDA_CODEC_CS8409 is not set
CONFIG_SND_HDA_CODEC_CONEXANT=m
CONFIG_SND_HDA_CODEC_CA0110=m
CONFIG_SND_HDA_CODEC_CA0132=m
@@ -6203,6 +6317,7 @@ CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
CONFIG_SND_SOC_AMD_ACP=m
# CONFIG_SND_SOC_AMD_CZ_DA7219MX98357_MACH is not set
# CONFIG_SND_SOC_AMD_CZ_RT5645_MACH is not set
+# CONFIG_SND_AMD_ACP_CONFIG is not set
# CONFIG_SND_ATMEL_SOC is not set
# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set
# CONFIG_SND_DESIGNWARE_I2S is not set
@@ -6270,6 +6385,7 @@ CONFIG_SND_SOC_I2C_AND_SPI=y
# CONFIG_SND_SOC_ADAU7118_I2C is not set
# CONFIG_SND_SOC_AK4104 is not set
# CONFIG_SND_SOC_AK4118 is not set
+# CONFIG_SND_SOC_AK4375 is not set
# CONFIG_SND_SOC_AK4458 is not set
# CONFIG_SND_SOC_AK4554 is not set
# CONFIG_SND_SOC_AK4613 is not set
@@ -6285,6 +6401,8 @@ CONFIG_SND_SOC_CROS_EC_CODEC=m
# CONFIG_SND_SOC_CS35L34 is not set
# CONFIG_SND_SOC_CS35L35 is not set
# CONFIG_SND_SOC_CS35L36 is not set
+# CONFIG_SND_SOC_CS35L41_SPI is not set
+# CONFIG_SND_SOC_CS35L41_I2C is not set
# CONFIG_SND_SOC_CS42L42 is not set
# CONFIG_SND_SOC_CS42L51_I2C is not set
# CONFIG_SND_SOC_CS42L52 is not set
@@ -6311,12 +6429,14 @@ CONFIG_SND_SOC_ES8328=m
CONFIG_SND_SOC_ES8328_I2C=m
CONFIG_SND_SOC_ES8328_SPI=m
# CONFIG_SND_SOC_GTM601 is not set
+# CONFIG_SND_SOC_ICS43432 is not set
# CONFIG_SND_SOC_INNO_RK3036 is not set
# CONFIG_SND_SOC_MAX98088 is not set
CONFIG_SND_SOC_MAX98357A=m
# CONFIG_SND_SOC_MAX98504 is not set
# CONFIG_SND_SOC_MAX9867 is not set
CONFIG_SND_SOC_MAX98927=m
+# CONFIG_SND_SOC_MAX98520 is not set
# CONFIG_SND_SOC_MAX98373_I2C is not set
# CONFIG_SND_SOC_MAX98373_SDW is not set
# CONFIG_SND_SOC_MAX98390 is not set
@@ -6351,6 +6471,8 @@ CONFIG_SND_SOC_RK3328=m
# CONFIG_SND_SOC_RT711_SDCA_SDW is not set
# CONFIG_SND_SOC_RT715_SDW is not set
# CONFIG_SND_SOC_RT715_SDCA_SDW is not set
+# CONFIG_SND_SOC_RT9120 is not set
+# CONFIG_SND_SOC_SDW_MOCKUP is not set
# CONFIG_SND_SOC_SGTL5000 is not set
CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m
# CONFIG_SND_SOC_SIMPLE_MUX is not set
@@ -6374,6 +6496,7 @@ CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m
# CONFIG_SND_SOC_TDA7419 is not set
# CONFIG_SND_SOC_TFA9879 is not set
# CONFIG_SND_SOC_TFA989X is not set
+# CONFIG_SND_SOC_TLV320ADC3XXX is not set
# CONFIG_SND_SOC_TLV320AIC23_I2C is not set
# CONFIG_SND_SOC_TLV320AIC23_SPI is not set
# CONFIG_SND_SOC_TLV320AIC31XX is not set
@@ -6422,6 +6545,7 @@ CONFIG_SND_SOC_WSA881X=m
# CONFIG_SND_SOC_NAU8315 is not set
# CONFIG_SND_SOC_NAU8540 is not set
# CONFIG_SND_SOC_NAU8810 is not set
+# CONFIG_SND_SOC_NAU8821 is not set
# CONFIG_SND_SOC_NAU8822 is not set
# CONFIG_SND_SOC_NAU8824 is not set
# CONFIG_SND_SOC_TPA6130A2 is not set
@@ -6429,11 +6553,14 @@ CONFIG_SND_SOC_WSA881X=m
# CONFIG_SND_SOC_LPASS_VA_MACRO is not set
# CONFIG_SND_SOC_LPASS_RX_MACRO is not set
# CONFIG_SND_SOC_LPASS_TX_MACRO is not set
+# CONFIG_SND_SOC_ACX00 is not set
# end of CODEC drivers
CONFIG_SND_SIMPLE_CARD_UTILS=m
CONFIG_SND_SIMPLE_CARD=m
CONFIG_SND_AUDIO_GRAPH_CARD=m
+# CONFIG_SND_AUDIO_GRAPH_CARD2 is not set
+# CONFIG_SND_TEST_COMPONENT is not set
# CONFIG_SND_VIRTIO is not set
CONFIG_AC97_BUS=m
@@ -6491,6 +6618,7 @@ CONFIG_HID_KYE=m
CONFIG_HID_UCLOGIC=m
CONFIG_HID_WALTOP=m
CONFIG_HID_VIEWSONIC=m
+# CONFIG_HID_XIAOMI is not set
CONFIG_HID_GYRATION=m
CONFIG_HID_ICADE=m
CONFIG_HID_ITE=m
@@ -6500,6 +6628,7 @@ CONFIG_HID_KENSINGTON=m
CONFIG_HID_LCPOWER=m
CONFIG_HID_LED=m
CONFIG_HID_LENOVO=m
+# CONFIG_HID_LETSKETCH is not set
CONFIG_HID_LOGITECH=m
CONFIG_HID_LOGITECH_DJ=m
CONFIG_HID_LOGITECH_HIDPP=m
@@ -6514,6 +6643,7 @@ CONFIG_HID_REDRAGON=m
CONFIG_HID_MICROSOFT=m
CONFIG_HID_MONTEREY=m
CONFIG_HID_MULTITOUCH=m
+# CONFIG_HID_NINTENDO is not set
CONFIG_HID_NTI=m
CONFIG_HID_NTRIG=m
CONFIG_HID_ORTEK=m
@@ -6528,7 +6658,6 @@ CONFIG_HID_PICOLCD_LCD=y
CONFIG_HID_PICOLCD_LEDS=y
CONFIG_HID_PICOLCD_CIR=y
CONFIG_HID_PLANTRONICS=m
-# CONFIG_HID_PLAYSTATION is not set
CONFIG_HID_PRIMAX=m
CONFIG_HID_RETRODE=m
CONFIG_HID_ROCCAT=m
@@ -7047,9 +7176,7 @@ CONFIG_LEDS_CLASS_FLASH=m
#
# LED drivers
#
-# CONFIG_LEDS_AAT1290 is not set
# CONFIG_LEDS_AN30259A is not set
-# CONFIG_LEDS_AS3645A is not set
# CONFIG_LEDS_AW2013 is not set
# CONFIG_LEDS_BCM6328 is not set
# CONFIG_LEDS_BCM6358 is not set
@@ -7059,7 +7186,6 @@ CONFIG_LEDS_LM3530=m
# CONFIG_LEDS_LM3532 is not set
# CONFIG_LEDS_LM3642 is not set
CONFIG_LEDS_LM3692X=m
-# CONFIG_LEDS_LM3601X is not set
# CONFIG_LEDS_PCA9532 is not set
CONFIG_LEDS_GPIO=y
CONFIG_LEDS_LP3944=m
@@ -7078,7 +7204,6 @@ CONFIG_LEDS_LT3593=m
# CONFIG_LEDS_TCA6507 is not set
# CONFIG_LEDS_TLC591XX is not set
# CONFIG_LEDS_LM355x is not set
-# CONFIG_LEDS_KTD2692 is not set
# CONFIG_LEDS_IS31FL319X is not set
# CONFIG_LEDS_IS31FL32XX is not set
@@ -7091,13 +7216,17 @@ CONFIG_LEDS_SYSCON=y
CONFIG_LEDS_USER=m
# CONFIG_LEDS_SPI_BYTE is not set
# CONFIG_LEDS_TI_LMU_COMMON is not set
-# CONFIG_LEDS_SGM3140 is not set
#
# Flash and Torch LED drivers
#
+# CONFIG_LEDS_AAT1290 is not set
+# CONFIG_LEDS_AS3645A is not set
+# CONFIG_LEDS_KTD2692 is not set
+# CONFIG_LEDS_LM3601X is not set
# CONFIG_LEDS_RT4505 is not set
# CONFIG_LEDS_RT8515 is not set
+# CONFIG_LEDS_SGM3140 is not set
#
# LED Triggers
@@ -7124,6 +7253,10 @@ CONFIG_LEDS_TRIGGER_NETDEV=y
CONFIG_LEDS_TRIGGER_PATTERN=m
CONFIG_LEDS_TRIGGER_AUDIO=m
# CONFIG_LEDS_TRIGGER_TTY is not set
+
+#
+# Simple LED drivers
+#
CONFIG_ACCESSIBILITY=y
CONFIG_A11Y_BRAILLE_CONSOLE=y
@@ -7323,6 +7456,7 @@ CONFIG_SYNC_FILE=y
# CONFIG_DMABUF_DEBUG is not set
# CONFIG_DMABUF_SELFTESTS is not set
# CONFIG_DMABUF_HEAPS is not set
+# CONFIG_DMABUF_SYSFS_STATS is not set
# end of DMABUF options
CONFIG_AUXDISPLAY=y
@@ -7343,13 +7477,14 @@ CONFIG_UIO_PCI_GENERIC=m
# CONFIG_UIO_NETX is not set
# CONFIG_UIO_PRUSS is not set
# CONFIG_UIO_MF624 is not set
+CONFIG_VFIO=m
CONFIG_VFIO_IOMMU_TYPE1=m
CONFIG_VFIO_VIRQFD=m
-CONFIG_VFIO=m
# CONFIG_VFIO_NOIOMMU is not set
-CONFIG_VFIO_PCI=m
+CONFIG_VFIO_PCI_CORE=m
CONFIG_VFIO_PCI_MMAP=y
CONFIG_VFIO_PCI_INTX=y
+CONFIG_VFIO_PCI=m
CONFIG_VFIO_PLATFORM=m
CONFIG_VFIO_AMBA=m
CONFIG_VFIO_PLATFORM_CALXEDAXGMAC_RESET=m
@@ -7359,6 +7494,7 @@ CONFIG_VFIO_FSL_MC=m
# CONFIG_VIRT_DRIVERS is not set
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI_LIB=y
+CONFIG_VIRTIO_PCI_LIB_LEGACY=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_PCI_LEGACY=y
@@ -7380,6 +7516,7 @@ CONFIG_VHOST_VSOCK=m
#
# Microsoft Hyper-V guest support
#
+# CONFIG_HYPERV is not set
# end of Microsoft Hyper-V guest support
# CONFIG_GREYBUS is not set
@@ -7395,7 +7532,6 @@ CONFIG_RTL8192E=m
# CONFIG_RTL8723BS is not set
CONFIG_R8712U=m
CONFIG_R8188EU=m
-CONFIG_88EU_AP_MODE=y
# CONFIG_RTS5208 is not set
# CONFIG_VT6655 is not set
# CONFIG_VT6656 is not set
@@ -7462,6 +7598,9 @@ CONFIG_AD2S1210=m
# CONFIG_FB_SM750 is not set
CONFIG_STAGING_MEDIA=y
+CONFIG_VIDEO_HANTRO=m
+CONFIG_VIDEO_HANTRO_SUNXI=y
+# CONFIG_VIDEO_MAX96712 is not set
CONFIG_VIDEO_SUNXI=y
CONFIG_VIDEO_SUNXI_CEDRUS=m
# CONFIG_VIDEO_ZORAN is not set
@@ -7513,14 +7652,12 @@ CONFIG_FB_TFT_TLS8204=m
CONFIG_FB_TFT_UC1611=m
CONFIG_FB_TFT_UC1701=m
CONFIG_FB_TFT_UPD161704=m
-CONFIG_FB_TFT_WATTEROTT=m
# CONFIG_KS7010 is not set
# CONFIG_PI433 is not set
# CONFIG_XIL_AXIS_FIFO is not set
# CONFIG_FIELDBUS_DEV is not set
# CONFIG_QLGE is not set
# CONFIG_WFX is not set
-# CONFIG_MFD_HI6421_SPMI is not set
# CONFIG_GOLDFISH is not set
CONFIG_CHROME_PLATFORMS=y
CONFIG_CHROMEOS_TBMC=m
@@ -7548,7 +7685,7 @@ CONFIG_COMMON_CLK=y
#
# Clock driver for ARM Reference designs
#
-# CONFIG_ICST is not set
+# CONFIG_CLK_ICST is not set
CONFIG_CLK_SP810=y
CONFIG_CLK_VEXPRESS_OSC=y
# end of Clock driver for ARM Reference designs
@@ -7569,6 +7706,7 @@ CONFIG_COMMON_CLK_SCPI=y
# CONFIG_COMMON_CLK_CS2000_CP is not set
CONFIG_COMMON_CLK_FSL_FLEXSPI=m
# CONFIG_COMMON_CLK_FSL_SAI is not set
+# CONFIG_COMMON_CLK_LAN966X is not set
# CONFIG_COMMON_CLK_S2MPS11 is not set
# CONFIG_COMMON_CLK_AXI_CLKGEN is not set
CONFIG_CLK_QORIQ=y
@@ -7590,7 +7728,6 @@ CONFIG_SUN50I_A100_R_CCU=y
CONFIG_SUN50I_H6_CCU=y
CONFIG_SUN50I_H616_CCU=y
CONFIG_SUN50I_H6_R_CCU=y
-# CONFIG_SUN8I_A83T_CCU is not set
CONFIG_SUN8I_H3_CCU=y
CONFIG_SUN8I_DE2_CCU=y
CONFIG_SUN8I_R_CCU=y
@@ -7640,6 +7777,8 @@ CONFIG_IOMMU_IO_PGTABLE_ARMV7S=y
# end of Generic IOMMU Pagetable Support
# CONFIG_IOMMU_DEBUGFS is not set
+CONFIG_IOMMU_DEFAULT_DMA_STRICT=y
+# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set
# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
CONFIG_OF_IOMMU=y
CONFIG_IOMMU_DMA=y
@@ -7745,6 +7884,7 @@ CONFIG_DEVFREQ_GOV_PASSIVE=y
#
# DEVFREQ Drivers
#
+CONFIG_ARM_SUN8I_A33_MBUS_DEVFREQ=m
CONFIG_PM_DEVFREQ_EVENT=y
CONFIG_EXTCON=y
@@ -7783,9 +7923,13 @@ CONFIG_IIO_TRIGGERED_EVENT=m
#
CONFIG_ADIS16201=m
CONFIG_ADIS16209=m
+# CONFIG_ADXL313_I2C is not set
+# CONFIG_ADXL313_SPI is not set
CONFIG_ADXL345=m
CONFIG_ADXL345_I2C=m
CONFIG_ADXL345_SPI=m
+# CONFIG_ADXL355_I2C is not set
+# CONFIG_ADXL355_SPI is not set
CONFIG_ADXL372=m
CONFIG_ADXL372_SPI=m
CONFIG_ADXL372_I2C=m
@@ -7904,6 +8048,12 @@ CONFIG_VIPERBOARD_ADC=m
# end of Analog to digital converters
#
+# Analog to digital and digital to analog converters
+#
+# CONFIG_AD74413R is not set
+# end of Analog to digital and digital to analog converters
+
+#
# Analog Front Ends
#
CONFIG_IIO_RESCALE=m
@@ -7936,9 +8086,12 @@ CONFIG_PMS7003=m
CONFIG_SCD30_CORE=m
CONFIG_SCD30_I2C=m
CONFIG_SCD30_SERIAL=m
+# CONFIG_SCD4X is not set
CONFIG_SENSIRION_SGP30=m
+# CONFIG_SENSIRION_SGP40 is not set
# CONFIG_SPS30_I2C is not set
# CONFIG_SPS30_SERIAL is not set
+# CONFIG_SENSEAIR_SUNRISE_CO2 is not set
CONFIG_VZ89X=m
# end of Chemical Sensors
@@ -7974,6 +8127,7 @@ CONFIG_IIO_ST_SENSORS_CORE=m
#
# Digital to analog converters
#
+# CONFIG_AD3552R is not set
CONFIG_AD5064=m
CONFIG_AD5360=m
CONFIG_AD5380=m
@@ -7995,6 +8149,7 @@ CONFIG_AD5764=m
# CONFIG_AD5766 is not set
CONFIG_AD5770R=m
CONFIG_AD5791=m
+# CONFIG_AD7293 is not set
CONFIG_AD7303=m
CONFIG_AD8801=m
CONFIG_DPOT_DAC=m
@@ -8020,6 +8175,12 @@ CONFIG_VF610_DAC=m
# end of IIO dummy driver
#
+# Filters
+#
+# CONFIG_ADMV8818 is not set
+# end of Filters
+
+#
# Frequency Synthesizers DDS/PLL
#
@@ -8034,6 +8195,8 @@ CONFIG_AD9523=m
#
CONFIG_ADF4350=m
CONFIG_ADF4371=m
+# CONFIG_ADMV1013 is not set
+# CONFIG_ADRF6780 is not set
# end of Phase-Locked Loop (PLL) frequency synthesizers
# end of Frequency Synthesizers DDS/PLL
@@ -8232,6 +8395,7 @@ CONFIG_IIO_SYSFS_TRIGGER=m
#
# Digital potentiometers
#
+# CONFIG_AD5110 is not set
CONFIG_AD5272=m
CONFIG_DS1803=m
CONFIG_MAX5432=m
@@ -8325,6 +8489,7 @@ CONFIG_TMP007=m
CONFIG_TSYS01=m
CONFIG_TSYS02D=m
CONFIG_MAX31856=m
+# CONFIG_MAX31865 is not set
# end of Temperature sensors
# CONFIG_NTB is not set
@@ -8376,15 +8541,23 @@ CONFIG_PHY_SUN4I_USB=y
CONFIG_PHY_SUN6I_MIPI_DPHY=m
# CONFIG_PHY_SUN9I_USB is not set
CONFIG_PHY_SUN50I_USB3=y
+
+#
+# PHY drivers for Broadcom platforms
+#
# CONFIG_BCM_KONA_USB2_PHY is not set
+# end of PHY drivers for Broadcom platforms
+
# CONFIG_PHY_CADENCE_TORRENT is not set
# CONFIG_PHY_CADENCE_DPHY is not set
# CONFIG_PHY_CADENCE_SIERRA is not set
# CONFIG_PHY_CADENCE_SALVO is not set
# CONFIG_PHY_FSL_IMX8MQ_USB is not set
CONFIG_PHY_MIXEL_MIPI_DPHY=m
+# CONFIG_PHY_FSL_IMX8M_PCIE is not set
# CONFIG_PHY_PXA_28NM_HSIC is not set
# CONFIG_PHY_PXA_28NM_USB2 is not set
+# CONFIG_PHY_LAN966X_SERDES is not set
# CONFIG_PHY_CPCAP_USB is not set
# CONFIG_PHY_MAPPHONE_MDM6600 is not set
# CONFIG_PHY_OCELOT_SERDES is not set
@@ -8414,6 +8587,7 @@ CONFIG_ARM_PMU_ACPI=y
# CONFIG_ARM_SPE_PMU is not set
# CONFIG_ARM_DMC620_PMU is not set
CONFIG_HISI_PMU=y
+# CONFIG_HISI_PCIE_PMU is not set
# end of Performance monitor support
CONFIG_RAS=y
@@ -8433,7 +8607,6 @@ CONFIG_ND_BTT=m
CONFIG_BTT=y
CONFIG_OF_PMEM=y
CONFIG_NVDIMM_KEYS=y
-CONFIG_DAX_DRIVER=y
CONFIG_DAX=y
CONFIG_NVMEM=y
CONFIG_NVMEM_SYSFS=y
@@ -8530,13 +8703,13 @@ CONFIG_F2FS_FS_SECURITY=y
# CONFIG_F2FS_CHECK_FS is not set
# CONFIG_F2FS_FAULT_INJECTION is not set
# CONFIG_F2FS_FS_COMPRESSION is not set
+CONFIG_F2FS_IOSTAT=y
# CONFIG_ZONEFS_FS is not set
# CONFIG_FS_DAX is not set
CONFIG_FS_POSIX_ACL=y
CONFIG_EXPORTFS=y
CONFIG_EXPORTFS_BLOCK_OPS=y
CONFIG_FILE_LOCKING=y
-CONFIG_MANDATORY_FILE_LOCKING=y
CONFIG_FS_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_ALGS=y
# CONFIG_FS_VERITY is not set
@@ -8569,15 +8742,13 @@ CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y
# Caches
#
CONFIG_NETFS_SUPPORT=m
-# CONFIG_NETFS_STATS is not set
+CONFIG_NETFS_STATS=y
CONFIG_FSCACHE=m
CONFIG_FSCACHE_STATS=y
-# CONFIG_FSCACHE_HISTOGRAM is not set
# CONFIG_FSCACHE_DEBUG is not set
-CONFIG_FSCACHE_OBJECT_LIST=y
CONFIG_CACHEFILES=m
# CONFIG_CACHEFILES_DEBUG is not set
-# CONFIG_CACHEFILES_HISTOGRAM is not set
+# CONFIG_CACHEFILES_ERROR_INJECTION is not set
# end of Caches
#
@@ -8601,6 +8772,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
CONFIG_EXFAT_FS=m
CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8"
# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS3_FS is not set
# end of DOS/FAT/EXFAT/NT Filesystems
#
@@ -8691,6 +8863,7 @@ CONFIG_PSTORE_COMPRESS_DEFAULT="deflate"
# CONFIG_PSTORE_CONSOLE is not set
# CONFIG_PSTORE_PMSG is not set
CONFIG_PSTORE_RAM=m
+# CONFIG_PSTORE_BLK is not set
CONFIG_SYSV_FS=m
CONFIG_UFS_FS=m
# CONFIG_UFS_FS_WRITE is not set
@@ -8747,7 +8920,6 @@ CONFIG_CEPH_FS_POSIX_ACL=y
CONFIG_CIFS=m
# CONFIG_CIFS_STATS2 is not set
CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y
-CONFIG_CIFS_WEAK_PW_HASH=y
CONFIG_CIFS_UPCALL=y
CONFIG_CIFS_XATTR=y
CONFIG_CIFS_POSIX=y
@@ -8757,6 +8929,8 @@ CONFIG_CIFS_DEBUG=y
CONFIG_CIFS_DFS_UPCALL=y
# CONFIG_CIFS_SWN_UPCALL is not set
CONFIG_CIFS_FSCACHE=y
+# CONFIG_SMB_SERVER is not set
+CONFIG_SMBFS_COMMON=m
CONFIG_CODA_FS=m
# CONFIG_AFS_FS is not set
CONFIG_9P_FS=m
@@ -8868,11 +9042,13 @@ CONFIG_INIT_STACK_NONE=y
# CONFIG_GCC_PLUGIN_STACKLEAK is not set
# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
+CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y
+# CONFIG_ZERO_CALL_USED_REGS is not set
# end of Memory initialization
# end of Kernel hardening options
# end of Security options
-CONFIG_XOR_BLOCKS=m
+CONFIG_XOR_BLOCKS=y
CONFIG_ASYNC_CORE=m
CONFIG_ASYNC_MEMCPY=m
CONFIG_ASYNC_XOR=m
@@ -8911,7 +9087,6 @@ CONFIG_CRYPTO_PCRYPT=m
CONFIG_CRYPTO_CRYPTD=y
CONFIG_CRYPTO_AUTHENC=m
# CONFIG_CRYPTO_TEST is not set
-CONFIG_CRYPTO_SIMD=y
CONFIG_CRYPTO_ENGINE=y
#
@@ -9038,26 +9213,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y
CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y
# CONFIG_CRYPTO_STATS is not set
CONFIG_CRYPTO_HASH_INFO=y
-
-#
-# Crypto library routines
-#
-CONFIG_CRYPTO_LIB_AES=y
-CONFIG_CRYPTO_LIB_ARC4=m
-CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m
-CONFIG_CRYPTO_LIB_BLAKE2S=m
-CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y
-CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y
-CONFIG_CRYPTO_LIB_CHACHA=m
-CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m
-CONFIG_CRYPTO_LIB_CURVE25519=m
-CONFIG_CRYPTO_LIB_DES=m
-CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9
-CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y
-CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y
-CONFIG_CRYPTO_LIB_POLY1305=m
-CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m
-CONFIG_CRYPTO_LIB_SHA256=y
CONFIG_CRYPTO_HW=y
CONFIG_CRYPTO_DEV_ALLWINNER=y
# CONFIG_CRYPTO_DEV_SUN4I_SS is not set
@@ -9136,7 +9291,6 @@ CONFIG_HAVE_ARCH_BITREVERSE=y
CONFIG_GENERIC_STRNCPY_FROM_USER=y
CONFIG_GENERIC_STRNLEN_USER=y
CONFIG_GENERIC_NET_UTILS=y
-CONFIG_GENERIC_FIND_FIRST_BIT=y
CONFIG_CORDIC=m
# CONFIG_PRIME_NUMBERS is not set
CONFIG_RATIONAL=y
@@ -9145,6 +9299,28 @@ CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
CONFIG_ARCH_USE_SYM_ANNOTATIONS=y
# CONFIG_INDIRECT_PIO is not set
+
+#
+# Crypto library routines
+#
+CONFIG_CRYPTO_LIB_AES=y
+CONFIG_CRYPTO_LIB_ARC4=m
+CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
+CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y
+CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y
+CONFIG_CRYPTO_LIB_CHACHA=m
+CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m
+CONFIG_CRYPTO_LIB_CURVE25519=m
+CONFIG_CRYPTO_LIB_DES=m
+CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9
+CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y
+CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y
+CONFIG_CRYPTO_LIB_POLY1305=m
+CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m
+CONFIG_CRYPTO_LIB_SHA256=y
+CONFIG_CRYPTO_LIB_SM4=y
+# end of Crypto library routines
+
CONFIG_CRC_CCITT=y
CONFIG_CRC16=y
CONFIG_CRC_T10DIF=y
@@ -9183,6 +9359,7 @@ CONFIG_XZ_DEC=y
CONFIG_XZ_DEC_ARM=y
CONFIG_XZ_DEC_ARMTHUMB=y
# CONFIG_XZ_DEC_SPARC is not set
+# CONFIG_XZ_DEC_MICROLZMA is not set
CONFIG_XZ_DEC_BCJ=y
# CONFIG_XZ_DEC_TEST is not set
CONFIG_DECOMPRESS_GZIP=y
@@ -9218,6 +9395,7 @@ CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y
CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y
CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y
CONFIG_SWIOTLB=y
+# CONFIG_DMA_RESTRICTED_POOL is not set
CONFIG_DMA_NONCOHERENT_MMAP=y
CONFIG_DMA_COHERENT_POOL=y
CONFIG_DMA_REMAP=y
@@ -9324,12 +9502,22 @@ CONFIG_KGDB_TESTS=y
# CONFIG_KGDB_KDB is not set
CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
# CONFIG_UBSAN is not set
+CONFIG_HAVE_ARCH_KCSAN=y
+CONFIG_HAVE_KCSAN_COMPILER=y
+# CONFIG_KCSAN is not set
# end of Generic Kernel Debugging Instruments
CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_MISC=y
#
+# Networking Debugging
+#
+# CONFIG_NET_DEV_REFCNT_TRACKER is not set
+# CONFIG_NET_NS_REFCNT_TRACKER is not set
+# end of Networking Debugging
+
+#
# Memory Debugging
#
# CONFIG_PAGE_EXTENSION is not set
@@ -9363,6 +9551,7 @@ CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y
CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y
CONFIG_HAVE_ARCH_KASAN_VMALLOC=y
CONFIG_CC_HAS_KASAN_GENERIC=y
+CONFIG_CC_HAS_KASAN_SW_TAGS=y
CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y
# CONFIG_KASAN is not set
CONFIG_HAVE_ARCH_KFENCE=y
@@ -9449,7 +9638,6 @@ CONFIG_RCU_CPU_STALL_TIMEOUT=60
# end of RCU Debugging
# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
# CONFIG_LATENCYTOP is not set
CONFIG_HAVE_FUNCTION_TRACER=y
@@ -9482,7 +9670,6 @@ CONFIG_FUNCTION_ERROR_INJECTION=y
# CONFIG_FAULT_INJECTION is not set
CONFIG_ARCH_HAS_KCOV=y
CONFIG_CC_HAS_SANCOV_TRACE_PC=y
-# CONFIG_KCOV is not set
# CONFIG_RUNTIME_TESTING_MENU is not set
CONFIG_ARCH_USE_MEMTEST=y
# CONFIG_MEMTEST is not set
diff --git a/drv-media-cedrus-10-bit-HEVC-support.patch b/drv-media-cedrus-10-bit-HEVC-support.patch
new file mode 100644
index 000000000000..99a921ef9a6c
--- /dev/null
+++ b/drv-media-cedrus-10-bit-HEVC-support.patch
@@ -0,0 +1,170 @@
+From 649d9696074a8446bda17be77b2277e72be2c2eb Mon Sep 17 00:00:00 2001
+From: Jernej Skrabec <jernej.skrabec@siol.net>
+Date: Sun, 15 Mar 2020 21:35:39 +0100
+Subject: [PATCH 056/101] drv:media:cedrus: 10-bit HEVC support
+
+WIp: 10-bit HEVC support
+
+Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
+---
+ drivers/staging/media/sunxi/cedrus/cedrus.c | 4 +--
+ .../staging/media/sunxi/cedrus/cedrus_h265.c | 12 ++++++++
+ .../staging/media/sunxi/cedrus/cedrus_regs.h | 4 +++
+ .../staging/media/sunxi/cedrus/cedrus_video.c | 30 +++++++++++++++----
+ .../staging/media/sunxi/cedrus/cedrus_video.h | 2 +-
+ 5 files changed, 44 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c
+index 314afde91..180fa9cee 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus.c
++++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
+@@ -336,7 +336,7 @@ static int cedrus_open(struct file *file)
+ goto err_ctrls;
+ }
+ ctx->dst_fmt.pixelformat = V4L2_PIX_FMT_NV12_32L32;
+- cedrus_prepare_format(&ctx->dst_fmt);
++ cedrus_prepare_format(&ctx->dst_fmt, 0);
+ ctx->src_fmt.pixelformat = V4L2_PIX_FMT_MPEG2_SLICE;
+ /*
+ * TILED_NV12 has more strict requirements, so copy the width and
+@@ -344,7 +344,7 @@ static int cedrus_open(struct file *file)
+ */
+ ctx->src_fmt.width = ctx->dst_fmt.width;
+ ctx->src_fmt.height = ctx->dst_fmt.height;
+- cedrus_prepare_format(&ctx->src_fmt);
++ cedrus_prepare_format(&ctx->src_fmt, 0);
+
+ v4l2_fh_add(&ctx->fh);
+
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
+index 3d7f87a80..7caec0e57 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
++++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
+@@ -534,6 +534,18 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
+
+ cedrus_write(dev, VE_DEC_H265_DEC_PCM_CTRL, reg);
+
++ if (sps->bit_depth_luma_minus8 == 2) {
++ unsigned int size;
++
++ size = ALIGN(ctx->src_fmt.width, 16) * ALIGN(ctx->src_fmt.height, 16);
++
++ reg = (size * 3) / 2;
++ cedrus_write(dev, VE_DEC_H265_OFFSET_ADDR_FIRST_OUT, reg);
++
++ reg = DIV_ROUND_UP(ctx->src_fmt.width, 4);
++ cedrus_write(dev, VE_DEC_H265_10BIT_CONFIGURE, ALIGN(reg, 32));
++ }
++
+ /* PPS. */
+
+ reg = VE_DEC_H265_DEC_PPS_CTRL0_PPS_CR_QP_OFFSET(pps->pps_cr_qp_offset) |
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h
+index bdb062ad8..7ab3a2b0a 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h
++++ b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h
+@@ -499,6 +499,10 @@
+
+ #define VE_DEC_H265_LOW_ADDR (VE_ENGINE_DEC_H265 + 0x80)
+
++#define VE_DEC_H265_OFFSET_ADDR_FIRST_OUT (VE_ENGINE_DEC_H265 + 0x84)
++#define VE_DEC_H265_OFFSET_ADDR_SECOND_OUT (VE_ENGINE_DEC_H265 + 0x88)
++#define VE_DEC_H265_10BIT_CONFIGURE (VE_ENGINE_DEC_H265 + 0x8c)
++
+ #define VE_DEC_H265_LOW_ADDR_PRIMARY_CHROMA(a) \
+ SHIFT_AND_MASK_BITS(a, 31, 24)
+ #define VE_DEC_H265_LOW_ADDR_SECONDARY_CHROMA(a) \
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.c b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
+index 80e33775b..247377138 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c
++++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
+@@ -100,7 +100,7 @@ static struct cedrus_format *cedrus_find_format(u32 pixelformat, u32 directions,
+ return &cedrus_formats[i];
+ }
+
+-void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt)
++void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt, int extended)
+ {
+ unsigned int width = pix_fmt->width;
+ unsigned int height = pix_fmt->height;
+@@ -155,6 +155,17 @@ void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt)
+ break;
+ }
+
++ if (extended) {
++ unsigned int extra_size;
++
++ extra_size = DIV_ROUND_UP(pix_fmt->width, 4);
++ extra_size = ALIGN(extra_size, 32);
++ extra_size *= ALIGN(pix_fmt->height, 16) * 3;
++ extra_size /= 2;
++
++ sizeimage += extra_size;
++ }
++
+ pix_fmt->width = width;
+ pix_fmt->height = height;
+
+@@ -247,17 +258,27 @@ static int cedrus_try_fmt_vid_cap(struct file *file, void *priv,
+ struct cedrus_ctx *ctx = cedrus_file2ctx(file);
+ struct cedrus_dev *dev = ctx->dev;
+ struct v4l2_pix_format *pix_fmt = &f->fmt.pix;
++ const struct v4l2_ctrl_hevc_sps *sps;
+ struct cedrus_format *fmt =
+ cedrus_find_format(pix_fmt->pixelformat, CEDRUS_DECODE_DST,
+ dev->capabilities);
++ int extended;
+
+ if (!fmt)
+ return -EINVAL;
+
++ sps = cedrus_find_control_data(ctx, V4L2_CID_MPEG_VIDEO_HEVC_SPS);
++
++ /* The 10-bitHEVC decoder needs extra size on the output buffer. */
++ extended = ctx->src_fmt.pixelformat == V4L2_PIX_FMT_HEVC_SLICE &&
++ sps->bit_depth_luma_minus8 == 2;
++
+ pix_fmt->pixelformat = fmt->pixelformat;
+ pix_fmt->width = ctx->src_fmt.width;
+ pix_fmt->height = ctx->src_fmt.height;
+- cedrus_prepare_format(pix_fmt);
++
++ pix_fmt->pixelformat = fmt->pixelformat;
++ cedrus_prepare_format(pix_fmt, extended);
+
+ return 0;
+ }
+@@ -275,8 +296,7 @@ static int cedrus_try_fmt_vid_out(struct file *file, void *priv,
+ if (!fmt)
+ return -EINVAL;
+
+- pix_fmt->pixelformat = fmt->pixelformat;
+- cedrus_prepare_format(pix_fmt);
++ cedrus_prepare_format(pix_fmt, 0);
+
+ return 0;
+ }
+@@ -357,7 +377,7 @@ static int cedrus_s_fmt_vid_out(struct file *file, void *priv,
+ ctx->dst_fmt.quantization = f->fmt.pix.quantization;
+ ctx->dst_fmt.width = ctx->src_fmt.width;
+ ctx->dst_fmt.height = ctx->src_fmt.height;
+- cedrus_prepare_format(&ctx->dst_fmt);
++ cedrus_prepare_format(&ctx->dst_fmt, 0);
+
+ return 0;
+ }
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.h b/drivers/staging/media/sunxi/cedrus/cedrus_video.h
+index 05050c0a0..d42e4ebf6 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.h
++++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.h
+@@ -26,6 +26,6 @@ extern const struct v4l2_ioctl_ops cedrus_ioctl_ops;
+
+ int cedrus_queue_init(void *priv, struct vb2_queue *src_vq,
+ struct vb2_queue *dst_vq);
+-void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt);
++void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt, int extended);
+
+ #endif
+--
+2.31.1
+
diff --git a/drv-media-cedrus-Add-callback-for-buffer-cleanup.patch b/drv-media-cedrus-Add-callback-for-buffer-cleanup.patch
new file mode 100644
index 000000000000..8b2b588f9461
--- /dev/null
+++ b/drv-media-cedrus-Add-callback-for-buffer-cleanup.patch
@@ -0,0 +1,57 @@
+From 93b5b1670e96f2a3a8dd1d5a9ac9d2b38c295917 Mon Sep 17 00:00:00 2001
+From: Jernej Skrabec <jernej.skrabec@siol.net>
+Date: Sat, 9 Nov 2019 13:06:15 +0100
+Subject: [PATCH 048/101] drv:media: cedrus: Add callback for buffer cleanup
+
+Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
+---
+ drivers/staging/media/sunxi/cedrus/cedrus.h | 1 +
+ drivers/staging/media/sunxi/cedrus/cedrus_video.c | 13 +++++++++++++
+ 2 files changed, 14 insertions(+)
+
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h
+index c790963ef..35faf42f2 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
++++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
+@@ -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);
++ void (*buf_cleanup)(struct cedrus_ctx *ctx, struct cedrus_buffer *buf);
+ };
+
+ struct cedrus_variant {
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.c b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
+index 6e1486987..80e33775b 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c
++++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
+@@ -469,6 +469,18 @@ static int cedrus_buf_prepare(struct vb2_buffer *vb)
+ return 0;
+ }
+
++static void cedrus_buf_cleanup(struct vb2_buffer *vb)
++{
++ struct vb2_queue *vq = vb->vb2_queue;
++ struct cedrus_ctx *ctx = vb2_get_drv_priv(vq);
++ struct cedrus_dev *dev = ctx->dev;
++ struct cedrus_dec_ops *ops = dev->dec_ops[ctx->current_codec];
++
++ if (!V4L2_TYPE_IS_OUTPUT(vq->type) && ops->buf_cleanup)
++ ops->buf_cleanup(ctx,
++ vb2_to_cedrus_buffer(vq->bufs[vb->index]));
++}
++
+ static int cedrus_start_streaming(struct vb2_queue *vq, unsigned int count)
+ {
+ struct cedrus_ctx *ctx = vb2_get_drv_priv(vq);
+@@ -551,6 +563,7 @@ static void cedrus_buf_request_complete(struct vb2_buffer *vb)
+ static struct vb2_ops cedrus_qops = {
+ .queue_setup = cedrus_queue_setup,
+ .buf_prepare = cedrus_buf_prepare,
++ .buf_cleanup = cedrus_buf_cleanup,
+ .buf_queue = cedrus_buf_queue,
+ .buf_out_validate = cedrus_buf_out_validate,
+ .buf_request_complete = cedrus_buf_request_complete,
+--
+2.31.1
+
diff --git a/drv-media-cedrus-h264-Improve-buffer-management.patch b/drv-media-cedrus-h264-Improve-buffer-management.patch
new file mode 100644
index 000000000000..5e8ae2e1db25
--- /dev/null
+++ b/drv-media-cedrus-h264-Improve-buffer-management.patch
@@ -0,0 +1,208 @@
+From eb94bf33cc1b37231063703c691c4b460481df7a Mon Sep 17 00:00:00 2001
+From: Jernej Skrabec <jernej.skrabec@siol.net>
+Date: Sat, 9 Nov 2019 14:12:42 +0100
+Subject: [PATCH 051/101] drv:media: cedrus: h264: Improve buffer management
+
+Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
+---
+ drivers/staging/media/sunxi/cedrus/cedrus.h | 3 +
+ .../staging/media/sunxi/cedrus/cedrus_h264.c | 95 ++++++++-----------
+ 2 files changed, 44 insertions(+), 54 deletions(-)
+
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h
+index 54a860ec7..25079901a 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
++++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
+@@ -105,6 +105,9 @@ struct cedrus_buffer {
+ struct {
+ unsigned int position;
+ enum cedrus_h264_pic_type pic_type;
++ void *mv_col_buf;
++ dma_addr_t mv_col_buf_dma;
++ ssize_t mv_col_buf_size;
+ } h264;
+ struct {
+ void *mv_col_buf;
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
+index b4173a892..787c1575c 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
++++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
+@@ -55,16 +55,14 @@ static void cedrus_h264_write_sram(struct cedrus_dev *dev,
+ }
+
+ static dma_addr_t cedrus_h264_mv_col_buf_addr(struct cedrus_ctx *ctx,
+- unsigned int position,
++ struct cedrus_buffer *buf,
+ unsigned int field)
+ {
+- dma_addr_t addr = ctx->codec.h264.mv_col_buf_dma;
+-
+- /* Adjust for the position */
+- addr += position * ctx->codec.h264.mv_col_buf_field_size * 2;
++ dma_addr_t addr = buf->codec.h264.mv_col_buf_dma;
+
+ /* Adjust for the field */
+- addr += field * ctx->codec.h264.mv_col_buf_field_size;
++ if (field)
++ addr += buf->codec.h264.mv_col_buf_size / 2;
+
+ return addr;
+ }
+@@ -76,7 +74,6 @@ static void cedrus_fill_ref_pic(struct cedrus_ctx *ctx,
+ struct cedrus_h264_sram_ref_pic *pic)
+ {
+ struct vb2_buffer *vbuf = &buf->m2m_buf.vb.vb2_buf;
+- unsigned int position = buf->codec.h264.position;
+
+ pic->top_field_order_cnt = cpu_to_le32(top_field_order_cnt);
+ pic->bottom_field_order_cnt = cpu_to_le32(bottom_field_order_cnt);
+@@ -85,9 +82,9 @@ static void cedrus_fill_ref_pic(struct cedrus_ctx *ctx,
+ pic->luma_ptr = cpu_to_le32(cedrus_buf_addr(vbuf, &ctx->dst_fmt, 0));
+ pic->chroma_ptr = cpu_to_le32(cedrus_buf_addr(vbuf, &ctx->dst_fmt, 1));
+ pic->mv_col_top_ptr =
+- cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, position, 0));
++ cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, buf, 0));
+ pic->mv_col_bot_ptr =
+- cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, position, 1));
++ cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, buf, 1));
+ }
+
+ static void cedrus_write_frame_list(struct cedrus_ctx *ctx,
+@@ -146,6 +143,28 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx,
+ output_buf = vb2_to_cedrus_buffer(&run->dst->vb2_buf);
+ output_buf->codec.h264.position = position;
+
++ if (!output_buf->codec.h264.mv_col_buf_size) {
++ const struct v4l2_ctrl_h264_sps *sps = run->h264.sps;
++ unsigned int field_size;
++
++ field_size = DIV_ROUND_UP(ctx->src_fmt.width, 16) *
++ DIV_ROUND_UP(ctx->src_fmt.height, 16) * 16;
++ if (!(sps->flags & V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE))
++ field_size = field_size * 2;
++ if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY))
++ field_size = field_size * 2;
++
++ output_buf->codec.h264.mv_col_buf_size = field_size * 2;
++ output_buf->codec.h264.mv_col_buf =
++ dma_alloc_attrs(dev->dev,
++ output_buf->codec.h264.mv_col_buf_size,
++ &output_buf->codec.h264.mv_col_buf_dma,
++ GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING);
++
++ if (!output_buf->codec.h264.mv_col_buf)
++ output_buf->codec.h264.mv_col_buf_size = 0;
++ }
++
+ if (decode->flags & V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC)
+ output_buf->codec.h264.pic_type = CEDRUS_H264_PIC_TYPE_FIELD;
+ else if (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD)
+@@ -516,8 +535,6 @@ static int cedrus_h264_start(struct cedrus_ctx *ctx)
+ {
+ struct cedrus_dev *dev = ctx->dev;
+ unsigned int pic_info_size;
+- unsigned int field_size;
+- unsigned int mv_col_size;
+ int ret;
+
+ /*
+@@ -565,38 +582,6 @@ static int cedrus_h264_start(struct cedrus_ctx *ctx)
+ goto err_pic_buf;
+ }
+
+- field_size = DIV_ROUND_UP(ctx->src_fmt.width, 16) *
+- DIV_ROUND_UP(ctx->src_fmt.height, 16) * 16;
+-
+- /*
+- * FIXME: This is actually conditional to
+- * V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE not being set, we
+- * might have to rework this if memory efficiency ever is
+- * something we need to work on.
+- */
+- field_size = field_size * 2;
+-
+- /*
+- * FIXME: This is actually conditional to
+- * V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY not being set, we might
+- * have to rework this if memory efficiency ever is something
+- * we need to work on.
+- */
+- field_size = field_size * 2;
+- ctx->codec.h264.mv_col_buf_field_size = field_size;
+-
+- mv_col_size = field_size * 2 * CEDRUS_H264_FRAME_NUM;
+- ctx->codec.h264.mv_col_buf_size = mv_col_size;
+- ctx->codec.h264.mv_col_buf =
+- dma_alloc_attrs(dev->dev,
+- ctx->codec.h264.mv_col_buf_size,
+- &ctx->codec.h264.mv_col_buf_dma,
+- GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING);
+- if (!ctx->codec.h264.mv_col_buf) {
+- ret = -ENOMEM;
+- goto err_neighbor_buf;
+- }
+-
+ if (ctx->src_fmt.width > 2048) {
+ /*
+ * Formulas for deblock and intra prediction buffer sizes
+@@ -612,7 +597,7 @@ static int cedrus_h264_start(struct cedrus_ctx *ctx)
+ GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING);
+ if (!ctx->codec.h264.deblk_buf) {
+ ret = -ENOMEM;
+- goto err_mv_col_buf;
++ goto err_neighbor_buf;
+ }
+
+ /*
+@@ -640,12 +625,6 @@ static int cedrus_h264_start(struct cedrus_ctx *ctx)
+ ctx->codec.h264.deblk_buf_dma,
+ DMA_ATTR_NO_KERNEL_MAPPING);
+
+-err_mv_col_buf:
+- dma_free_attrs(dev->dev, ctx->codec.h264.mv_col_buf_size,
+- ctx->codec.h264.mv_col_buf,
+- ctx->codec.h264.mv_col_buf_dma,
+- DMA_ATTR_NO_KERNEL_MAPPING);
+-
+ err_neighbor_buf:
+ dma_free_attrs(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE,
+ ctx->codec.h264.neighbor_info_buf,
+@@ -664,10 +643,6 @@ static void cedrus_h264_stop(struct cedrus_ctx *ctx)
+ {
+ struct cedrus_dev *dev = ctx->dev;
+
+- dma_free_attrs(dev->dev, ctx->codec.h264.mv_col_buf_size,
+- ctx->codec.h264.mv_col_buf,
+- ctx->codec.h264.mv_col_buf_dma,
+- DMA_ATTR_NO_KERNEL_MAPPING);
+ dma_free_attrs(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE,
+ ctx->codec.h264.neighbor_info_buf,
+ ctx->codec.h264.neighbor_info_buf_dma,
+@@ -696,6 +671,17 @@ static void cedrus_h264_trigger(struct cedrus_ctx *ctx)
+ VE_H264_TRIGGER_TYPE_AVC_SLICE_DECODE);
+ }
+
++static void cedrus_h264_buf_cleanup(struct cedrus_ctx *ctx,
++ struct cedrus_buffer *buf)
++{
++ if (buf->codec.h264.mv_col_buf_size)
++ dma_free_attrs(ctx->dev->dev,
++ buf->codec.h264.mv_col_buf_size,
++ buf->codec.h264.mv_col_buf,
++ buf->codec.h264.mv_col_buf_dma,
++ DMA_ATTR_NO_KERNEL_MAPPING);
++}
++
+ struct cedrus_dec_ops cedrus_dec_ops_h264 = {
+ .irq_clear = cedrus_h264_irq_clear,
+ .irq_disable = cedrus_h264_irq_disable,
+@@ -704,4 +690,5 @@ struct cedrus_dec_ops cedrus_dec_ops_h264 = {
+ .start = cedrus_h264_start,
+ .stop = cedrus_h264_stop,
+ .trigger = cedrus_h264_trigger,
++ .buf_cleanup = cedrus_h264_buf_cleanup,
+ };
+--
+2.31.1
+
+
diff --git a/drv-media-cedrus-hevc-Improve-buffer-management.patch b/drv-media-cedrus-hevc-Improve-buffer-management.patch
new file mode 100644
index 000000000000..42ccc693d012
--- /dev/null
+++ b/drv-media-cedrus-hevc-Improve-buffer-management.patch
@@ -0,0 +1,245 @@
+From e5464070b7b15a21dc9bc133734f95a45d0c58e4 Mon Sep 17 00:00:00 2001
+From: Jernej Skrabec <jernej.skrabec@siol.net>
+Date: Sat, 9 Nov 2019 13:22:05 +0100
+Subject: [PATCH 049/101] drv:media:cedrus: hevc: Improve buffer management
+
+Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
+---
+ drivers/staging/media/sunxi/cedrus/cedrus.h | 9 +-
+ .../staging/media/sunxi/cedrus/cedrus_h265.c | 119 ++++++++++--------
+ 2 files changed, 70 insertions(+), 58 deletions(-)
+
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h
+index 35faf42f2..6ddcff8f5 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
++++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
+@@ -106,6 +106,11 @@ struct cedrus_buffer {
+ unsigned int position;
+ enum cedrus_h264_pic_type pic_type;
+ } h264;
++ struct {
++ void *mv_col_buf;
++ dma_addr_t mv_col_buf_dma;
++ ssize_t mv_col_buf_size;
++ } h265;
+ } codec;
+ };
+
+@@ -139,10 +144,6 @@ struct cedrus_ctx {
+ ssize_t intra_pred_buf_size;
+ } h264;
+ struct {
+- void *mv_col_buf;
+- dma_addr_t mv_col_buf_addr;
+- ssize_t mv_col_buf_size;
+- ssize_t mv_col_buf_unit_size;
+ void *neighbor_info_buf;
+ dma_addr_t neighbor_info_buf_addr;
+ void *entry_points_buf;
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
+index 4fa5016a2..3d7f87a80 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
++++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
+@@ -91,26 +91,66 @@ static void cedrus_h265_sram_write_data(struct cedrus_dev *dev, void *data,
+
+ static inline dma_addr_t
+ cedrus_h265_frame_info_mv_col_buf_addr(struct cedrus_ctx *ctx,
+- unsigned int index, unsigned int field)
++ unsigned int index,
++ const struct v4l2_ctrl_hevc_sps *sps)
+ {
+- return ctx->codec.h265.mv_col_buf_addr + index *
+- ctx->codec.h265.mv_col_buf_unit_size +
+- field * ctx->codec.h265.mv_col_buf_unit_size / 2;
++ struct cedrus_buffer *cedrus_buf = NULL;
++ struct vb2_buffer *buf = NULL;
++ struct vb2_queue *vq;
++
++ vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
++ if (vq)
++ buf = vb2_get_buffer(vq, index);
++
++ if (buf)
++ cedrus_buf = vb2_to_cedrus_buffer(buf);
++
++ if (!cedrus_buf)
++ return 0;
++
++ if (!cedrus_buf->codec.h265.mv_col_buf_size) {
++ unsigned int ctb_size_luma, width_in_ctb_luma;
++ unsigned int log2_max_luma_coding_block_size;
++
++ log2_max_luma_coding_block_size =
++ sps->log2_min_luma_coding_block_size_minus3 + 3 +
++ sps->log2_diff_max_min_luma_coding_block_size;
++ ctb_size_luma = 1 << log2_max_luma_coding_block_size;
++ width_in_ctb_luma = DIV_ROUND_UP(sps->pic_width_in_luma_samples,
++ ctb_size_luma);
++
++ cedrus_buf->codec.h265.mv_col_buf_size = ALIGN(width_in_ctb_luma *
++ DIV_ROUND_UP(sps->pic_height_in_luma_samples, ctb_size_luma) *
++ CEDRUS_H265_MV_COL_BUF_UNIT_CTB_SIZE, 1024);
++
++ cedrus_buf->codec.h265.mv_col_buf =
++ dma_alloc_attrs(ctx->dev->dev,
++ cedrus_buf->codec.h265.mv_col_buf_size,
++ &cedrus_buf->codec.h265.mv_col_buf_dma,
++ GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING);
++
++ if (!cedrus_buf->codec.h265.mv_col_buf) {
++ cedrus_buf->codec.h265.mv_col_buf_size = 0;
++ cedrus_buf->codec.h265.mv_col_buf_dma = 0;
++ }
++ }
++
++ return cedrus_buf->codec.h265.mv_col_buf_dma;
+ }
+
+ static void cedrus_h265_frame_info_write_single(struct cedrus_ctx *ctx,
+ unsigned int index,
+ bool field_pic,
+ u32 pic_order_cnt[],
+- int buffer_index)
++ int buffer_index,
++ const struct v4l2_ctrl_hevc_sps *sps)
+ {
+ struct cedrus_dev *dev = ctx->dev;
+ dma_addr_t dst_luma_addr = cedrus_dst_buf_addr(ctx, buffer_index, 0);
+ dma_addr_t dst_chroma_addr = cedrus_dst_buf_addr(ctx, buffer_index, 1);
+ dma_addr_t mv_col_buf_addr[2] = {
+- cedrus_h265_frame_info_mv_col_buf_addr(ctx, buffer_index, 0),
+- cedrus_h265_frame_info_mv_col_buf_addr(ctx, buffer_index,
+- field_pic ? 1 : 0)
++ cedrus_h265_frame_info_mv_col_buf_addr(ctx, buffer_index, sps),
++ cedrus_h265_frame_info_mv_col_buf_addr(ctx, buffer_index, sps)
+ };
+ u32 offset = VE_DEC_H265_SRAM_OFFSET_FRAME_INFO +
+ VE_DEC_H265_SRAM_OFFSET_FRAME_INFO_UNIT * index;
+@@ -134,7 +174,8 @@ static void cedrus_h265_frame_info_write_single(struct cedrus_ctx *ctx,
+
+ static void cedrus_h265_frame_info_write_dpb(struct cedrus_ctx *ctx,
+ const struct v4l2_hevc_dpb_entry *dpb,
+- u8 num_active_dpb_entries)
++ u8 num_active_dpb_entries,
++ const struct v4l2_ctrl_hevc_sps *sps)
+ {
+ struct vb2_queue *vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE);
+@@ -149,7 +190,7 @@ static void cedrus_h265_frame_info_write_dpb(struct cedrus_ctx *ctx,
+
+ cedrus_h265_frame_info_write_single(ctx, i, dpb[i].field_pic,
+ pic_order_cnt,
+- buffer_index);
++ buffer_index, sps);
+ }
+ }
+
+@@ -388,37 +388,6 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
+ width_in_ctb_luma =
+ DIV_ROUND_UP(sps->pic_width_in_luma_samples, ctb_size_luma);
+
+- /* MV column buffer size and allocation. */
+- if (!ctx->codec.h265.mv_col_buf_size) {
+- unsigned int num_buffers =
+- run->dst->vb2_buf.vb2_queue->num_buffers;
+-
+- /*
+- * Each CTB requires a MV col buffer with a specific unit size.
+- * Since the address is given with missing lsb bits, 1 KiB is
+- * added to each buffer to ensure proper alignment.
+- */
+- ctx->codec.h265.mv_col_buf_unit_size =
+- DIV_ROUND_UP(ctx->src_fmt.width, ctb_size_luma) *
+- DIV_ROUND_UP(ctx->src_fmt.height, ctb_size_luma) *
+- CEDRUS_H265_MV_COL_BUF_UNIT_CTB_SIZE + SZ_1K;
+-
+- ctx->codec.h265.mv_col_buf_size = num_buffers *
+- ctx->codec.h265.mv_col_buf_unit_size;
+-
+- /* Buffer is never accessed by CPU, so we can skip kernel mapping. */
+- ctx->codec.h265.mv_col_buf =
+- dma_alloc_attrs(dev->dev,
+- ctx->codec.h265.mv_col_buf_size,
+- &ctx->codec.h265.mv_col_buf_addr,
+- GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING);
+- if (!ctx->codec.h265.mv_col_buf) {
+- ctx->codec.h265.mv_col_buf_size = 0;
+- // TODO: Abort the process here.
+- return;
+- }
+- }
+-
+ /* Activate H265 engine. */
+ cedrus_engine_enable(ctx, CEDRUS_CODEC_H265);
+
+@@ -671,7 +682,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
+
+ /* Write decoded picture buffer in pic list. */
+ 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. */
+
+@@ -682,7 +693,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
+ cedrus_h265_frame_info_write_single(ctx, output_pic_list_index,
+ slice_params->pic_struct != 0,
+ pic_order_cnt,
+- run->dst->vb2_buf.index);
++ run->dst->vb2_buf.index, sps);
+
+ cedrus_write(dev, VE_DEC_H265_OUTPUT_FRAME_IDX, output_pic_list_index);
+
+@@ -732,9 +701,6 @@ static int cedrus_h265_start(struct cedrus_ctx *ctx)
+ {
+ struct cedrus_dev *dev = ctx->dev;
+
+- /* The buffer size is calculated at setup time. */
+- ctx->codec.h265.mv_col_buf_size = 0;
+-
+ /* Buffer is never accessed by CPU, so we can skip kernel mapping. */
+ ctx->codec.h265.neighbor_info_buf =
+ dma_alloc_attrs(dev->dev, CEDRUS_H265_NEIGHBOR_INFO_BUF_SIZE,
+@@ -759,15 +767,6 @@ static void cedrus_h265_stop(struct cedrus_ctx *ctx)
+ {
+ struct cedrus_dev *dev = ctx->dev;
+
+- if (ctx->codec.h265.mv_col_buf_size > 0) {
+- dma_free_attrs(dev->dev, ctx->codec.h265.mv_col_buf_size,
+- ctx->codec.h265.mv_col_buf,
+- ctx->codec.h265.mv_col_buf_addr,
+- DMA_ATTR_NO_KERNEL_MAPPING);
+-
+- ctx->codec.h265.mv_col_buf_size = 0;
+- }
+-
+ dma_free_attrs(dev->dev, CEDRUS_H265_NEIGHBOR_INFO_BUF_SIZE,
+ ctx->codec.h265.neighbor_info_buf,
+ ctx->codec.h265.neighbor_info_buf_addr,
+@@ -784,6 +783,17 @@ static void cedrus_h265_trigger(struct cedrus_ctx *ctx)
+ cedrus_write(dev, VE_DEC_H265_TRIGGER, VE_DEC_H265_TRIGGER_DEC_SLICE);
+ }
+
++static void cedrus_h265_buf_cleanup(struct cedrus_ctx *ctx,
++ struct cedrus_buffer *buf)
++{
++ if (buf->codec.h265.mv_col_buf_size)
++ dma_free_attrs(ctx->dev->dev,
++ buf->codec.h265.mv_col_buf_size,
++ buf->codec.h265.mv_col_buf,
++ buf->codec.h265.mv_col_buf_dma,
++ DMA_ATTR_NO_KERNEL_MAPPING);
++}
++
+ struct cedrus_dec_ops cedrus_dec_ops_h265 = {
+ .irq_clear = cedrus_h265_irq_clear,
+ .irq_disable = cedrus_h265_irq_disable,
+@@ -792,4 +802,5 @@ struct cedrus_dec_ops cedrus_dec_ops_h265 = {
+ .start = cedrus_h265_start,
+ .stop = cedrus_h265_stop,
+ .trigger = cedrus_h265_trigger,
++ .buf_cleanup = cedrus_h265_buf_cleanup,
+ };
+--
+2.31.1
+
diff --git a/drv-media-cedrus-hevc-tiles-hack.patch b/drv-media-cedrus-hevc-tiles-hack.patch
new file mode 100644
index 000000000000..7d1238b08c63
--- /dev/null
+++ b/drv-media-cedrus-hevc-tiles-hack.patch
@@ -0,0 +1,180 @@
+From 08ec2c0d449a9e91f9174b347bd3f560f50ca872 Mon Sep 17 00:00:00 2001
+From: Jernej Skrabec <jernej.skrabec@siol.net>
+Date: Sat, 26 Oct 2019 21:23:55 +0200
+Subject: [PATCH 046/101] drv:media: cedrus: hevc: tiles hack
+
+Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
+---
+ drivers/staging/media/sunxi/cedrus/cedrus.h | 2 +
+ .../staging/media/sunxi/cedrus/cedrus_h265.c | 93 +++++++++++++++++--
+ 2 files changed, 89 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h
+index 9c7bfd2b6..c790963ef 100644
+--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
++++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
+@@ -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;
+ struct {
+ unsigned int last_frame_p_type;
+diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
+index bb7eb5610..4fa5016a2 100644
+--- 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_list(struct cedrus_ctx *ctx,
+ }
+ }
+
++static void write_entry_point_list(struct cedrus_ctx *ctx,
++ struct cedrus_run *run,
++ unsigned int ctb_addr_x,
++ unsigned int ctb_addr_y)
++{
++ const struct v4l2_ctrl_hevc_slice_params *slice_params;
++ const struct v4l2_ctrl_hevc_pps *pps;
++ struct cedrus_dev *dev = ctx->dev;
++ int i, x, tx, y, ty;
++ u32 *entry_points;
++
++ pps = run->h265.pps;
++ slice_params = run->h265.slice_params;
++
++ for (x = 0, tx = 0; tx < pps->num_tile_columns_minus1 + 1; tx++) {
++ if (x + pps->column_width_minus1[tx] + 1 > ctb_addr_x)
++ break;
++
++ x += pps->column_width_minus1[tx] + 1;
++ }
++
++ for (y = 0, ty = 0; ty < pps->num_tile_rows_minus1 + 1; ty++) {
++ if (y + pps->row_height_minus1[ty] + 1 > ctb_addr_y)
++ break;
++
++ y += pps->row_height_minus1[ty] + 1;
++ }
++
++ cedrus_write(dev, VE_DEC_H265_TILE_START_CTB, (y << 16) | (x << 0));
++ cedrus_write(dev, VE_DEC_H265_TILE_END_CTB,
++ ((y + pps->row_height_minus1[ty]) << 16) |
++ ((x + pps->column_width_minus1[tx]) << 0));
++
++ entry_points = ctx->codec.h265.entry_points_buf;
++ if (pps->flags & V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED) {
++ for (i = 0; i < slice_params->num_entry_point_offsets; i++)
++ entry_points[i] = slice_params->entry_point_offset_minus1[i] + 1;
++ } else {
++ for (i = 0; i < slice_params->num_entry_point_offsets; i++) {
++ if (tx + 1 >= pps->num_tile_columns_minus1 + 1) {
++ x = 0;
++ tx = 0;
++ y += pps->row_height_minus1[ty++] + 1;
++ } else {
++ x += pps->column_width_minus1[tx++] + 1;
++ }
++
++ entry_points[i * 4 + 0] = slice_params->entry_point_offset_minus1[i] + 1;
++ entry_points[i * 4 + 1] = 0x0;
++ entry_points[i * 4 + 2] = (y << 16) | (x << 0);
++ entry_points[i * 4 + 3] = ((y + pps->row_height_minus1[ty]) << 16) | ((x + pps->column_width_minus1[tx]) << 0);
++ }
++ }
++}
++
+ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
+ struct cedrus_run *run)
+ {
+@@ -312,6 +367,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
+ 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;
++ unsigned int ctb_addr_x, ctb_addr_y;
+ dma_addr_t src_buf_addr;
+ dma_addr_t src_buf_end_addr;
+ u32 chroma_log2_weight_denom;
+@@ -390,12 +446,19 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
+ cedrus_write(dev, VE_DEC_H265_BITS_END_ADDR, reg);
+
+ /* Coding tree block address */
+- reg = VE_DEC_H265_DEC_CTB_ADDR_X(slice_params->slice_segment_addr % width_in_ctb_luma);
+- reg |= VE_DEC_H265_DEC_CTB_ADDR_Y(slice_params->slice_segment_addr / width_in_ctb_luma);
++ ctb_addr_x = slice_params->slice_segment_addr % width_in_ctb_luma;
++ ctb_addr_y = slice_params->slice_segment_addr / width_in_ctb_luma;
++ reg = VE_DEC_H265_DEC_CTB_ADDR_X(ctb_addr_x);
++ reg |= VE_DEC_H265_DEC_CTB_ADDR_Y(ctb_addr_y);
+ cedrus_write(dev, VE_DEC_H265_DEC_CTB_ADDR, reg);
+
+- cedrus_write(dev, VE_DEC_H265_TILE_START_CTB, 0);
+- cedrus_write(dev, VE_DEC_H265_TILE_END_CTB, 0);
++ if ((pps->flags & V4L2_HEVC_PPS_FLAG_TILES_ENABLED) ||
++ (pps->flags & V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED)) {
++ write_entry_point_list(ctx, run, ctb_addr_x, ctb_addr_y);
++ } else {
++ cedrus_write(dev, VE_DEC_H265_TILE_START_CTB, 0);
++ cedrus_write(dev, VE_DEC_H265_TILE_END_CTB, 0);
++ }
+
+ /* Clear the number of correctly-decoded coding tree blocks. */
+ if (ctx->fh.m2m_ctx->new_frame)
+@@ -499,7 +562,9 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
+ V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED,
+ pps->flags);
+
+- /* TODO: VE_DEC_H265_DEC_PPS_CTRL1_FLAG_TILES_ENABLED */
++ reg |= VE_DEC_H265_FLAG(VE_DEC_H265_DEC_PPS_CTRL1_FLAG_TILES_ENABLED,
++ V4L2_HEVC_PPS_FLAG_TILES_ENABLED,
++ pps->flags);
+
+ reg |= VE_DEC_H265_FLAG(VE_DEC_H265_DEC_PPS_CTRL1_FLAG_TRANSQUANT_BYPASS_ENABLED,
+ V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED,
+@@ -575,12 +640,14 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
+
+ chroma_log2_weight_denom = pred_weight_table->luma_log2_weight_denom +
+ pred_weight_table->delta_chroma_log2_weight_denom;
+- reg = VE_DEC_H265_DEC_SLICE_HDR_INFO2_NUM_ENTRY_POINT_OFFSETS(0) |
++ reg = VE_DEC_H265_DEC_SLICE_HDR_INFO2_NUM_ENTRY_POINT_OFFSETS(slice_params->num_entry_point_offsets) |
+ VE_DEC_H265_DEC_SLICE_HDR_INFO2_CHROMA_LOG2_WEIGHT_DENOM(chroma_log2_weight_denom) |
+ VE_DEC_H265_DEC_SLICE_HDR_INFO2_LUMA_LOG2_WEIGHT_DENOM(pred_weight_table->luma_log2_weight_denom);
+
+ cedrus_write(dev, VE_DEC_H265_DEC_SLICE_HDR_INFO2, reg);
+
++ cedrus_write(dev, VE_DEC_H265_ENTRY_POINT_OFFSET_ADDR, ctx->codec.h265.entry_points_buf_addr >> 8);
++
+ /* Decoded picture size. */
+
+ reg = VE_DEC_H265_DEC_PIC_SIZE_WIDTH(ctx->src_fmt.width) |
+@@ -674,6 +741,17 @@ static int cedrus_h265_start(struct cedrus_ctx *ctx)
+ if (!ctx->codec.h265.neighbor_info_buf)
+ return -ENOMEM;
+
++ ctx->codec.h265.entry_points_buf =
++ dma_alloc_coherent(dev->dev, CEDRUS_H265_ENTRY_POINTS_BUF_SIZE,
++ &ctx->codec.h265.entry_points_buf_addr,
++ GFP_KERNEL);
++ if (!ctx->codec.h265.entry_points_buf) {
++ dma_free_coherent(dev->dev, CEDRUS_H265_NEIGHBOR_INFO_BUF_SIZE,
++ ctx->codec.h265.neighbor_info_buf,
++ ctx->codec.h265.neighbor_info_buf_addr);
++ return -ENOMEM;
++ }
++
+ return 0;
+ }
+
+@@ -694,6 +772,9 @@ static void cedrus_h265_stop(struct cedrus_ctx *ctx)
+ ctx->codec.h265.neighbor_info_buf,
+ ctx->codec.h265.neighbor_info_buf_addr,
+ DMA_ATTR_NO_KERNEL_MAPPING);
++ dma_free_coherent(dev->dev, CEDRUS_H265_ENTRY_POINTS_BUF_SIZE,
++ ctx->codec.h265.entry_points_buf,
++ ctx->codec.h265.entry_points_buf_addr);
+ }
+
+ static void cedrus_h265_trigger(struct cedrus_ctx *ctx)
+--
+2.31.1
+
diff --git a/0001-mfd-Add-support-for-AC200.patch b/drv-mfd-Add-support-for-AC200.patch
index f74e3c209c36..0a79ef9e9176 100644
--- a/0001-mfd-Add-support-for-AC200.patch
+++ b/drv-mfd-Add-support-for-AC200.patch
@@ -1,7 +1,7 @@
-From d98aa318aabd4aba05328f9c832b23bdf2e1677a Mon Sep 17 00:00:00 2001
+From 3e6411db1aa4dfe1d1a6d63c2cbed2c588d35aef Mon Sep 17 00:00:00 2001
From: Jernej Skrabec <jernej.skrabec@siol.net>
Date: Fri, 16 Aug 2019 16:38:21 +0200
-Subject: [PATCH 1/4] mfd: Add support for AC200
+Subject: [PATCH 006/101] drv:mfd: Add support for AC200
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
---
@@ -14,7 +14,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
create mode 100644 include/linux/mfd/ac200.h
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
-index 420900852166..a45e7c88ac9b 100644
+index d2f345245..5b756e81b 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -178,6 +178,15 @@ config MFD_AC100
@@ -22,7 +22,7 @@ index 420900852166..a45e7c88ac9b 100644
components like codecs or RTC under the corresponding menus.
+config MFD_AC200
-+ tristate "X-Powers AC200"
++ bool "X-Powers AC200"
+ select MFD_CORE
+ depends on I2C
+ help
@@ -34,10 +34,10 @@ index 420900852166..a45e7c88ac9b 100644
tristate
select MFD_CORE
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
-index aed99f08739f..4431a4cf19ca 100644
+index 2ba6646e8..7edc825f9 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
-@@ -141,6 +141,7 @@ obj-$(CONFIG_MFD_DA9052_SPI) += da9052-spi.o
+@@ -142,6 +142,7 @@ obj-$(CONFIG_MFD_DA9052_SPI) += da9052-spi.o
obj-$(CONFIG_MFD_DA9052_I2C) += da9052-i2c.o
obj-$(CONFIG_MFD_AC100) += ac100.o
@@ -47,7 +47,7 @@ index aed99f08739f..4431a4cf19ca 100644
obj-$(CONFIG_MFD_AXP20X_RSB) += axp20x-rsb.o
diff --git a/drivers/mfd/ac200.c b/drivers/mfd/ac200.c
new file mode 100644
-index 000000000000..570573790d91
+index 000000000..570573790
--- /dev/null
+++ b/drivers/mfd/ac200.c
@@ -0,0 +1,170 @@
@@ -223,7 +223,7 @@ index 000000000000..570573790d91
+MODULE_LICENSE("GPL v2");
diff --git a/include/linux/mfd/ac200.h b/include/linux/mfd/ac200.h
new file mode 100644
-index 000000000000..0c677094a5b3
+index 000000000..0c677094a
--- /dev/null
+++ b/include/linux/mfd/ac200.h
@@ -0,0 +1,208 @@
@@ -436,5 +436,5 @@ index 000000000000..0c677094a5b3
+
+#endif /* __LINUX_MFD_AC200_H */
--
-2.20.1
+2.31.1
diff --git a/0002-net-phy-Add-support-for-AC200-EPHY.patch b/drv-net-phy-Add-support-for-AC200-EPHY.patch
index ff87c895fb3d..f763bd4e2097 100644
--- a/0002-net-phy-Add-support-for-AC200-EPHY.patch
+++ b/drv-net-phy-Add-support-for-AC200-EPHY.patch
@@ -1,7 +1,7 @@
-From 1b528543ea41a9837d39e9ab621631c77122f1aa Mon Sep 17 00:00:00 2001
+From e0b1f9c0e3ca7fb234215eef9f643a8fb98a4d06 Mon Sep 17 00:00:00 2001
From: Jernej Skrabec <jernej.skrabec@siol.net>
Date: Fri, 16 Aug 2019 16:38:57 +0200
-Subject: [PATCH 2/4] net: phy: Add support for AC200 EPHY
+Subject: [PATCH 009/101] drv:net:phy: Add support for AC200 EPHY
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
---
@@ -12,12 +12,12 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
create mode 100644 drivers/net/phy/ac200.c
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
-index 2e016271e126..248d9384091c 100644
+index 902495afc..056b7965d 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
-@@ -266,6 +266,13 @@ config ADIN_PHY
- - ADIN1300 - Robust,Industrial, Low Latency 10/100/1000 Gigabit
- Ethernet PHY
+@@ -63,6 +63,13 @@ config SFP
+
+ comment "MII PHY device drivers"
+config AC200_PHY
+ tristate "AC200 EPHY"
@@ -28,12 +28,12 @@ index 2e016271e126..248d9384091c 100644
+
config AMD_PHY
tristate "AMD PHYs"
- ---help---
+ help
diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
-index fe5badf13b65..2143587f010e 100644
+index b2728d00f..dbaa8f29c 100644
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
-@@ -49,6 +49,7 @@ obj-$(CONFIG_SFP) += sfp.o
+@@ -30,6 +30,7 @@ obj-$(CONFIG_SFP) += sfp.o
sfp-obj-$(CONFIG_SFP) += sfp-bus.o
obj-y += $(sfp-obj-y) $(sfp-obj-m)
@@ -43,7 +43,7 @@ index fe5badf13b65..2143587f010e 100644
aquantia-objs += aquantia_main.o
diff --git a/drivers/net/phy/ac200.c b/drivers/net/phy/ac200.c
new file mode 100644
-index 000000000000..cb713188f7ec
+index 000000000..cb713188f
--- /dev/null
+++ b/drivers/net/phy/ac200.c
@@ -0,0 +1,220 @@
@@ -268,5 +268,5 @@ index 000000000000..cb713188f7ec
+MODULE_DESCRIPTION("AC200 Ethernet PHY driver");
+MODULE_LICENSE("GPL");
--
-2.20.1
+2.31.1
diff --git a/drv-pinctrl-sunxi-pinctrl-sun50i-h6.c-GPIO-disable_strict_mode.patch b/drv-pinctrl-sunxi-pinctrl-sun50i-h6.c-GPIO-disable_strict_mode.patch
new file mode 100644
index 000000000000..482b724462b6
--- /dev/null
+++ b/drv-pinctrl-sunxi-pinctrl-sun50i-h6.c-GPIO-disable_strict_mode.patch
@@ -0,0 +1,25 @@
+From f847d2c94b8345f73c5f9e7fa29cea96d2339234 Mon Sep 17 00:00:00 2001
+From: The-going <48602507+The-going@users.noreply.github.com>
+Date: Tue, 1 Feb 2022 19:11:11 +0300
+Subject: [PATCH 02/50] drv:pinctrl:sunxi:pinctrl-sun50i-h6.c GPIO
+ disable_strict_mode
+
+---
+ drivers/pinctrl/sunxi/pinctrl-sun50i-h6.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/pinctrl/sunxi/pinctrl-sun50i-h6.c b/drivers/pinctrl/sunxi/pinctrl-sun50i-h6.c
+index 3cc112158..1182cc864 100644
+--- a/drivers/pinctrl/sunxi/pinctrl-sun50i-h6.c
++++ b/drivers/pinctrl/sunxi/pinctrl-sun50i-h6.c
+@@ -588,6 +588,7 @@ static const unsigned int h6_irq_bank_map[] = { 1, 5, 6, 7 };
+ static const struct sunxi_pinctrl_desc h6_pinctrl_data = {
+ .pins = h6_pins,
+ .npins = ARRAY_SIZE(h6_pins),
++ .disable_strict_mode = true,
+ .irq_banks = 4,
+ .irq_bank_map = h6_irq_bank_map,
+ .irq_read_needs_mux = true,
+--
+2.34.1
+
diff --git a/fastgit_wget.sh b/fastgit_wget.sh
new file mode 100644
index 000000000000..b5e98acfd66b
--- /dev/null
+++ b/fastgit_wget.sh
@@ -0,0 +1,3 @@
+links=$(sed -e "s|github.com|raw.fastgit.org|g" -e "s|/blob||g" $1)
+echo $links
+wget -c -q $links
diff --git a/0004-net-stmmac-sun8i-Add-support-for-enabling-a-regulato.patch b/net-stmmac-sun8i-Add-support-for-enabling-a-regulator-for-PHY-I.patch
index a38543d319b9..a794b531a27e 100644
--- a/0004-net-stmmac-sun8i-Add-support-for-enabling-a-regulato.patch
+++ b/net-stmmac-sun8i-Add-support-for-enabling-a-regulator-for-PHY-I.patch
@@ -1,8 +1,8 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ondrej Jirman <megous@megous.com>
+From 97d6eb56c5d765ef33016e08b92310c609c9c353 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ond=C5=99ej=20Jirman?= <megi@xff.cz>
Date: Tue, 20 Aug 2019 14:31:38 +0200
-Subject: [PATCH] net: stmmac: sun8i: Add support for enabling a regulator for
- PHY I/O pins
+Subject: [PATCH 072/456] net: stmmac: sun8i: Add support for enabling a
+ regulator for PHY I/O pins
Orange Pi 3 has two regulators that power the Realtek RTL8211E. According
to the phy datasheet, both regulators need to be enabled at the same time.
@@ -10,11 +10,13 @@ to the phy datasheet, both regulators need to be enabled at the same time.
Add support for the second optional regulator, "phy-io", to the glue
driver.
-Signed-off-by: Ondrej Jirman <megous@megous.com>
+Signed-off-by: Ondrej Jirman <megi@xff.cz>
---
- .../net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 23 ++++++++++++++++++-
- 1 file changed, 22 insertions(+), 1 deletion(-)
+ .../net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 22 ++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
+diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
+index b44f14c278ca..afa2a61d7ec8 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
@@ -61,6 +61,8 @@ struct emac_variant {
@@ -34,7 +36,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 platform_device *pdev, void *priv)
struct sunxi_priv_data *gmac = priv;
int ret;
@@ -52,7 +54,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 @@ static int sun8i_dwmac_init(struct platform_device *pdev, void *priv)
clk_disable_unprepare(gmac->tx_clk);
err_disable_regulator:
regulator_disable(gmac->regulator_phy);
@@ -61,7 +63,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 platform_device *pdev, void *priv)
clk_disable_unprepare(gmac->tx_clk);
regulator_disable(gmac->regulator_phy);
@@ -69,7 +71,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
+@@ -1179,6 +1191,14 @@ static int sun8i_dwmac_probe(struct platform_device *pdev)
return ret;
}
@@ -77,11 +79,13 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
+ gmac->regulator_phy_io = devm_regulator_get(dev, "phy-io");
+ if (IS_ERR(gmac->regulator_phy_io)) {
+ ret = PTR_ERR(gmac->regulator_phy_io);
-+ if (ret != -EPROBE_DEFER)
-+ dev_err(dev, "Failed to get PHY I/O regulator (%d)\n", ret);
++ dev_err_probe(dev, ret, "Failed to get PHY I/O regulator\n");
+ return ret;
+ }
+
/* The "GMAC clock control" register might be located in the
* CCU address range (on the R40), or the system control address
* range (on most other sun8i and later SoCs).
+--
+2.34.1
+
diff --git a/0003-net-stmmac-sun8i-Rename-PHY-regulator-variable-to-re.patch b/net-stmmac-sun8i-Rename-PHY-regulator-variable-to-regulator_phy.patch
index 81132eb2b0ff..942157148d12 100644
--- a/0003-net-stmmac-sun8i-Rename-PHY-regulator-variable-to-re.patch
+++ b/net-stmmac-sun8i-Rename-PHY-regulator-variable-to-regulator_phy.patch
@@ -1,17 +1,19 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ondrej Jirman <megous@megous.com>
+From 93aeb9e1d803bae947d8a47ce90a1a57663ee0da Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ond=C5=99ej=20Jirman?= <megi@xff.cz>
Date: Tue, 20 Aug 2019 14:29:29 +0200
-Subject: [PATCH] net: stmmac: sun8i: Rename PHY regulator variable to
+Subject: [PATCH 070/456] net: stmmac: sun8i: Rename PHY regulator variable to
regulator_phy
We'll be adding further optional regulators, and this makes it clearer
what the regulator is for.
-Signed-off-by: Ondrej Jirman <megous@megous.com>
+Signed-off-by: Ondrej Jirman <megi@xff.cz>
---
- .../net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 39 +++++++++----------
- 1 file changed, 19 insertions(+), 20 deletions(-)
+ .../net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 40 +++++++++----------
+ 1 file changed, 20 insertions(+), 20 deletions(-)
+diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
+index c0c8ce1f8b00..b44f14c278ca 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
@@ -57,20 +57,22 @@ struct emac_variant {
@@ -47,7 +49,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 platform_device *pdev, void *priv)
struct sunxi_priv_data *gmac = priv;
int ret;
@@ -59,7 +61,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 platform_device *pdev, void *priv)
err_disable_clk:
clk_disable_unprepare(gmac->tx_clk);
err_disable_regulator:
@@ -69,7 +71,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 platform_device *pdev, void *priv)
clk_disable_unprepare(gmac->tx_clk);
@@ -78,7 +80,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,10 @@ static int sun8i_dwmac_probe(struct platform_device *pdev)
}
/* Optional regulator for PHY */
@@ -89,7 +91,11 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
- dev_err(dev, "Failed to get PHY regulator (%d)\n", ret);
+ gmac->regulator_phy = devm_regulator_get(dev, "phy");
+ if (IS_ERR(gmac->regulator_phy)) {
++ ret = PTR_ERR(gmac->regulator_phy);
+ dev_err_probe(dev, ret, "Failed to get PHY regulator\n");
return ret;
}
+--
+2.34.1
+
diff --git a/0002-net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regu.patch b/net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regulator.patch
index 50e7cc4d460e..a371a65ffa42 100644
--- a/0002-net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regu.patch
+++ b/net-stmmac-sun8i-Use-devm_regulator_get-for-PHY-regulator.patch
@@ -1,7 +1,8 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ondrej Jirman <megous@megous.com>
+From b29d33d0e22bc5305c62de369642f842a205f80a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ond=C5=99ej=20Jirman?= <megi@xff.cz>
Date: Wed, 27 Mar 2019 13:21:06 +0100
-Subject: [PATCH] net: stmmac: sun8i: Use devm_regulator_get for PHY regulator
+Subject: [PATCH 068/456] net: stmmac: sun8i: Use devm_regulator_get for PHY
+ regulator
Use devm_regulator_get instead of devm_regulator_get_optional and rely
on dummy supply. This avoids NULL checks before regulator_enable/disable
@@ -15,14 +16,16 @@ was reported previously on errors and lack of regulator property in DT.
Finally, we'll be adding further optional regulators, and the overall
code will be simpler.
-Signed-off-by: Ondrej Jirman <megous@megous.com>
+Signed-off-by: Ondrej Jirman <megi@xff.cz>
---
.../net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 23 ++++++++-----------
1 file changed, 10 insertions(+), 13 deletions(-)
+diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
+index 09644ab0d87a..c0c8ce1f8b00 100644
--- 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 platform_device *pdev, void *priv)
struct sunxi_priv_data *gmac = priv;
int ret;
@@ -39,7 +42,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 platform_device *pdev, void *priv)
clk_disable_unprepare(gmac->tx_clk);
@@ -49,7 +52,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 platform_device *pdev)
}
/* Optional regulator for PHY */
@@ -67,3 +70,6 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
}
/* The "GMAC clock control" register might be located in the
+--
+2.34.1
+
diff --git a/patches-links.txt b/patches-links.txt
new file mode 100644
index 000000000000..514e74779e2a
--- /dev/null
+++ b/patches-links.txt
@@ -0,0 +1,3 @@
+https://github.com/armbian/build/blob/master/patch/kernel/archive/sunxi-5.17/patches.armbian/HACK-media-uapi-hevc-tiles-and-num_slices.patch
+https://github.com/armbian/build/blob/master/patch/kernel/archive/sunxi-5.17/patches.armbian/Revert-net-Remove-net-ipx.h-and-uapi-linux-ipx.h-hea.patch
+https://github.com/armbian/build/blob/master/patch/kernel/archive/sunxi-5.17/patches.armbian/WIP-media-uapi-hevc-add-fields-needed-for-rkvdec.patch
diff --git a/sun50i-h6-tqc-a01.dts b/sun50i-h6-tqc-a01.dts
index e3e01fad4797..543ff87cd704 100644
--- a/sun50i-h6-tqc-a01.dts
+++ b/sun50i-h6-tqc-a01.dts
@@ -152,6 +152,10 @@
};
};
+&i2s1 {
+ status = "okay";
+};
+
&i2c3 {
status = "okay";
};
@@ -342,6 +346,10 @@
clocks = <&ext_osc32k>;
};
+&sound_hdmi {
+ status = "okay";
+};
+
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_ph_pins>;