[PATCH 04/29][SRU][OEM-5.14] UBUNTU: SAUCE: IPU driver release WW52

You-Sheng Yang vicamo.yang at canonical.com
Tue Dec 28 06:19:30 UTC 2021


From: Wang Yating <yating.wang at intel.com>

BugLink: https://bugs.launchpad.net/bugs/1955383

Signed-off-by: Wang Yating <yating.wang at intel.com>
(backported from
https://github.com/intel/ipu6-drivers/commit/71392b666a028c77126a9098fedb1fb30fc30568)
Signed-off-by: You-Sheng Yang <vicamo.yang at canonical.com>
---
 drivers/media/i2c/hm11b1.c                    |   8 +-
 drivers/media/i2c/ov01a1s.c                   |   8 +-
 drivers/media/i2c/pmic_dsc1.c                 | 158 +++++++++++
 drivers/media/i2c/pmic_dsc1.h                 |  33 +++
 drivers/media/pci/intel/Kconfig               |  37 +--
 drivers/media/pci/intel/Makefile              |   4 +-
 drivers/media/pci/intel/ipu-buttress.c        | 262 ++++++------------
 drivers/media/pci/intel/ipu-buttress.h        |   5 +-
 drivers/media/pci/intel/ipu-dma.c             |   2 +
 drivers/media/pci/intel/ipu-fw-isys.c         |   2 +
 .../media/pci/intel/ipu-isys-csi2-be-soc.c    |  32 +++
 drivers/media/pci/intel/ipu-isys-csi2-be.c    |  31 +++
 drivers/media/pci/intel/ipu-isys-queue.c      |   4 +
 drivers/media/pci/intel/ipu-isys-video.c      |  98 +++++--
 drivers/media/pci/intel/ipu-isys-video.h      |   4 +
 drivers/media/pci/intel/ipu-isys.c            |  21 +-
 drivers/media/pci/intel/ipu-mmu.c             |   4 +-
 drivers/media/pci/intel/ipu-psys-compat32.c   |   5 +-
 drivers/media/pci/intel/ipu-psys.c            |   9 +-
 drivers/media/pci/intel/ipu-psys.h            |   2 +-
 drivers/media/pci/intel/ipu-trace.c           |  20 +-
 drivers/media/pci/intel/ipu.c                 |   6 +
 drivers/media/pci/intel/ipu6/Makefile         |   6 +-
 .../intel/ipu6/ipu-platform-buttress-regs.h   |   6 +-
 .../media/pci/intel/ipu6/ipu-platform-isys.h  |   8 +
 .../media/pci/intel/ipu6/ipu-platform-psys.h  |   3 +-
 drivers/media/pci/intel/ipu6/ipu-resources.c  |   2 -
 .../media/pci/intel/ipu6/ipu6-fw-resources.c  |  20 --
 drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c |   2 +-
 drivers/media/pci/intel/ipu6/ipu6-isys-gpc.c  |  18 +-
 drivers/media/pci/intel/ipu6/ipu6-isys-phy.c  |  23 +-
 .../media/pci/intel/ipu6/ipu6-l-scheduler.c   |  28 +-
 drivers/media/pci/intel/ipu6/ipu6-ppg.c       |  22 +-
 drivers/media/pci/intel/ipu6/ipu6-psys-gpc.c  |  18 +-
 drivers/media/pci/intel/ipu6/ipu6-psys.c      |  38 +--
 drivers/media/pci/intel/ipu6/ipu6.c           |  23 --
 .../pci/intel/ipu6/ipu6se-fw-resources.c      |   2 -
 include/uapi/linux/ipu-isys.h                 |   1 +
 38 files changed, 558 insertions(+), 417 deletions(-)
 create mode 100644 drivers/media/i2c/pmic_dsc1.c
 create mode 100644 drivers/media/i2c/pmic_dsc1.h

diff --git a/drivers/media/i2c/hm11b1.c b/drivers/media/i2c/hm11b1.c
index 9c1662b842de..35f49eb7b852 100644
--- a/drivers/media/i2c/hm11b1.c
+++ b/drivers/media/i2c/hm11b1.c
@@ -10,6 +10,7 @@
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-fwnode.h>
+#include "pmic_dsc1.h"
 
 #define HM11B1_LINK_FREQ_384MHZ		384000000ULL
 #define HM11B1_SCLK			72000000LL
@@ -1000,6 +1001,7 @@ static int hm11b1_start_streaming(struct hm11b1 *hm11b1)
 	int link_freq_index;
 	int ret = 0;
 
+	pmic_dsc1_set_power(1);
 	link_freq_index = hm11b1->cur_mode->link_freq_index;
 	reg_list = &link_freq_configs[link_freq_index].reg_list;
 	ret = hm11b1_write_reg_list(hm11b1, reg_list);
@@ -1034,6 +1036,7 @@ static void hm11b1_stop_streaming(struct hm11b1 *hm11b1)
 	if (hm11b1_write_reg(hm11b1, HM11B1_REG_MODE_SELECT, 1,
 			     HM11B1_MODE_STANDBY))
 		dev_err(&client->dev, "failed to stop streaming");
+	pmic_dsc1_set_power(0);
 }
 
 static int hm11b1_set_stream(struct v4l2_subdev *sd, int enable)
@@ -1275,6 +1278,8 @@ static int hm11b1_probe(struct i2c_client *client)
 		return -ENOMEM;
 
 	v4l2_i2c_subdev_init(&hm11b1->sd, client, &hm11b1_subdev_ops);
+	pmic_dsc1_set_power(0);
+	pmic_dsc1_set_power(1);
 	ret = hm11b1_identify_module(hm11b1);
 	if (ret) {
 		dev_err(&client->dev, "failed to find sensor: %d", ret);
@@ -1315,6 +1320,7 @@ static int hm11b1_probe(struct i2c_client *client)
 	pm_runtime_enable(&client->dev);
 	pm_runtime_idle(&client->dev);
 
+	pmic_dsc1_set_power(0);
 	return 0;
 
 probe_error_media_entity_cleanup:
@@ -1333,7 +1339,7 @@ static const struct dev_pm_ops hm11b1_pm_ops = {
 
 #ifdef CONFIG_ACPI
 static const struct acpi_device_id hm11b1_acpi_ids[] = {
-	{"HM11B1"},
+	{"HIMX11B1"},
 	{}
 };
 
diff --git a/drivers/media/i2c/ov01a1s.c b/drivers/media/i2c/ov01a1s.c
index 1d05b75347a1..766fe30116c3 100644
--- a/drivers/media/i2c/ov01a1s.c
+++ b/drivers/media/i2c/ov01a1s.c
@@ -10,6 +10,7 @@
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-fwnode.h>
+#include "pmic_dsc1.h"
 
 #define OV01A1S_LINK_FREQ_400MHZ		400000000ULL
 #define OV01A1S_SCLK			40000000LL
@@ -566,6 +567,7 @@ static int ov01a1s_start_streaming(struct ov01a1s *ov01a1s)
 	int link_freq_index;
 	int ret = 0;
 
+	pmic_dsc1_set_power(1);
 	link_freq_index = ov01a1s->cur_mode->link_freq_index;
 	reg_list = &link_freq_configs[link_freq_index].reg_list;
 	ret = ov01a1s_write_reg_list(ov01a1s, reg_list);
@@ -602,6 +604,7 @@ static void ov01a1s_stop_streaming(struct ov01a1s *ov01a1s)
 				OV01A1S_MODE_STANDBY);
 	if (ret)
 		dev_err(&client->dev, "failed to stop streaming");
+	pmic_dsc1_set_power(0);
 }
 
 static int ov01a1s_set_stream(struct v4l2_subdev *sd, int enable)
@@ -843,6 +846,8 @@ static int ov01a1s_probe(struct i2c_client *client)
 		return -ENOMEM;
 
 	v4l2_i2c_subdev_init(&ov01a1s->sd, client, &ov01a1s_subdev_ops);
+	pmic_dsc1_set_power(0);
+	pmic_dsc1_set_power(1);
 	ret = ov01a1s_identify_module(ov01a1s);
 	if (ret) {
 		dev_err(&client->dev, "failed to find sensor: %d", ret);
@@ -883,6 +888,7 @@ static int ov01a1s_probe(struct i2c_client *client)
 	pm_runtime_enable(&client->dev);
 	pm_runtime_idle(&client->dev);
 
+	pmic_dsc1_set_power(0);
 	return 0;
 
 probe_error_media_entity_cleanup:
@@ -901,7 +907,7 @@ static const struct dev_pm_ops ov01a1s_pm_ops = {
 
 #ifdef CONFIG_ACPI
 static const struct acpi_device_id ov01a1s_acpi_ids[] = {
-	{ "OVTI01AF" },
+	{ "OVTI01AS" },
 	{}
 };
 
diff --git a/drivers/media/i2c/pmic_dsc1.c b/drivers/media/i2c/pmic_dsc1.c
new file mode 100644
index 000000000000..9892bc506e0b
--- /dev/null
+++ b/drivers/media/i2c/pmic_dsc1.c
@@ -0,0 +1,158 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2020 Intel Corporation.
+
+#include <linux/delay.h>
+#include <linux/module.h>
+#include "pmic_dsc1.h"
+
+/* mcu gpio resources*/
+static const struct acpi_gpio_params camreset_gpio  = { 0, 0, false };
+static const struct acpi_gpio_params campwdn_gpio   = { 1, 0, false };
+static const struct acpi_gpio_params midmclken_gpio = { 2, 0, false };
+static const struct acpi_gpio_params led_gpio       = { 3, 0, false };
+static const struct acpi_gpio_mapping dsc1_acpi_gpios[] = {
+	{ "camreset-gpios", &camreset_gpio, 1 },
+	{ "campwdn-gpios", &campwdn_gpio, 1 },
+	{ "midmclken-gpios", &midmclken_gpio, 1 },
+	{ "indled-gpios", &led_gpio, 1 },
+	{ }
+};
+
+static const char * const pin_names[] = {
+	"camreset", "campwdn", "midmclken", "indled"
+};
+
+struct pmic_dsc1 pmic = {
+	.reset_gpio = NULL,
+	.powerdn_gpio = NULL,
+	.clocken_gpio = NULL,
+	.indled_gpio = NULL,
+	.power_on = false,
+	.gpio_ready = false,
+};
+
+static int get_gpio_pin(struct gpio_desc **pin_d, struct pci_dev *pdev, int idx)
+{
+	int count = PMIC_DSC1_PROBE_MAX_TRY;
+
+	do {
+		dev_dbg(&pdev->dev, "get %s:tried once\n", pin_names[idx]);
+		*pin_d = devm_gpiod_get(&pdev->dev, pin_names[idx],
+					GPIOD_OUT_LOW);
+		if (!IS_ERR(*pin_d))
+			return 0;
+		*pin_d = NULL;
+		msleep_interruptible(PMIC_DSC1_PROBE_TRY_GAP);
+	} while (--count > 0);
+
+	return -EBUSY;
+}
+
+static int pmic_dsc1_probe(struct pci_dev *pdev,
+			   const struct pci_device_id *id)
+{
+	int ret;
+
+	if (!pdev) {
+		dev_err(&pdev->dev, "@%s: probed null pdev %x:%x\n",
+			__func__, PCI_BRG_VENDOR_ID, PCI_BRG_PRODUCT_ID);
+		return -ENODEV;
+	}
+	dev_dbg(&pdev->dev, "@%s, enter\n", __func__);
+
+	ret = devm_acpi_dev_add_driver_gpios(&pdev->dev, dsc1_acpi_gpios);
+	if (ret) {
+		dev_err(&pdev->dev, "@%s: fail to add gpio\n", __func__);
+		return -EBUSY;
+	}
+	ret = get_gpio_pin(&pmic.reset_gpio, pdev, 0);
+	if (ret)
+		goto pmic_dsc1_probe_end;
+	ret = get_gpio_pin(&pmic.powerdn_gpio, pdev, 1);
+	if (ret)
+		goto pmic_dsc1_probe_end;
+	ret = get_gpio_pin(&pmic.clocken_gpio, pdev, 2);
+	if (ret)
+		goto pmic_dsc1_probe_end;
+	ret = get_gpio_pin(&pmic.indled_gpio, pdev, 3);
+	if (ret)
+		goto pmic_dsc1_probe_end;
+
+	mutex_lock(&pmic.status_lock);
+	pmic.gpio_ready = true;
+	mutex_unlock(&pmic.status_lock);
+
+pmic_dsc1_probe_end:
+	dev_dbg(&pdev->dev, "@%s, exit\n", __func__);
+	return ret;
+}
+
+static void pmic_dsc1_remove(struct pci_dev *pdev)
+{
+	dev_dbg(&pdev->dev, "@%s, enter\n", __func__);
+	mutex_lock(&pmic.status_lock);
+	pmic.gpio_ready = false;
+	gpiod_set_value_cansleep(pmic.reset_gpio, 0);
+	gpiod_put(pmic.reset_gpio);
+	gpiod_set_value_cansleep(pmic.powerdn_gpio, 0);
+	gpiod_put(pmic.powerdn_gpio);
+	gpiod_set_value_cansleep(pmic.clocken_gpio, 0);
+	gpiod_put(pmic.clocken_gpio);
+	gpiod_set_value_cansleep(pmic.indled_gpio, 0);
+	gpiod_put(pmic.indled_gpio);
+	mutex_unlock(&pmic.status_lock);
+	dev_dbg(&pdev->dev, "@%s, exit\n", __func__);
+}
+
+static struct pci_device_id pmic_dsc1_ids[] = {
+	{ PCI_DEVICE(PCI_BRG_VENDOR_ID, PCI_BRG_PRODUCT_ID) },
+	{ 0, },
+};
+MODULE_DEVICE_TABLE(pci, pmic_dsc1_ids);
+
+static struct pci_driver pmic_dsc1_driver = {
+	.name     = PMIC_DRV_NAME,
+	.id_table = pmic_dsc1_ids,
+	.probe    = pmic_dsc1_probe,
+	.remove   = pmic_dsc1_remove,
+};
+
+static int __init pmic_dsc1_init(void)
+{
+	mutex_init(&pmic.status_lock);
+	return pci_register_driver(&pmic_dsc1_driver);
+}
+
+static void __exit pmic_dsc1_exit(void)
+{
+	pci_unregister_driver(&pmic_dsc1_driver);
+}
+module_init(pmic_dsc1_init);
+module_exit(pmic_dsc1_exit);
+
+int pmic_dsc1_set_power(int on)
+{
+	mutex_lock(&pmic.status_lock);
+	if (!pmic.gpio_ready || on < 0 || on > 1) {
+		pr_debug("@%s,failed to set power, gpio_ready=%d, on=%d\n",
+			 __func__, pmic.gpio_ready, on);
+		mutex_unlock(&pmic.status_lock);
+		return -EBUSY;
+	}
+	if (pmic.power_on != on) {
+		gpiod_set_value_cansleep(pmic.reset_gpio, on);
+		gpiod_set_value_cansleep(pmic.powerdn_gpio, on);
+		gpiod_set_value_cansleep(pmic.clocken_gpio, on);
+		gpiod_set_value_cansleep(pmic.indled_gpio, on);
+		pmic.power_on = on;
+	}
+	mutex_unlock(&pmic.status_lock);
+	return 0;
+}
+EXPORT_SYMBOL_GPL(pmic_dsc1_set_power);
+
+MODULE_AUTHOR("Bingbu Cao <bingbu.cao at intel.com>");
+MODULE_AUTHOR("Qiu, Tianshu <tian.shu.qiu at intel.com>");
+MODULE_AUTHOR("Xu, Chongyang <chongyang.xu at intel.com>");
+MODULE_DESCRIPTION("PMIC-CRDG DSC1 driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/media/i2c/pmic_dsc1.h b/drivers/media/i2c/pmic_dsc1.h
new file mode 100644
index 000000000000..19f1112f85f8
--- /dev/null
+++ b/drivers/media/i2c/pmic_dsc1.h
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (c) 2020 Intel Corporation. */
+
+#ifndef _PMIC_DSC1_H_
+#define _PMIC_DSC1_H_
+
+#include <linux/gpio/consumer.h>
+#include <linux/mutex.h>
+#include <linux/pci.h>
+
+/* pmic dsc1 pci id */
+#define PCI_BRG_VENDOR_ID  0x8086
+#define PCI_BRG_PRODUCT_ID 0x9a14
+
+#define PMIC_DRV_NAME "pmic_dsc1"
+#define PMIC_DSC1_PROBE_MAX_TRY 5
+#define PMIC_DSC1_PROBE_TRY_GAP 500 /* in millseconds */
+
+struct pmic_dsc1 {
+	/* gpio resource*/
+	struct gpio_desc *reset_gpio;
+	struct gpio_desc *powerdn_gpio;
+	struct gpio_desc *clocken_gpio;
+	struct gpio_desc *indled_gpio;
+	/* status */
+	struct mutex status_lock;
+	bool power_on;
+	bool gpio_ready;
+};
+
+/* exported function for extern module */
+int pmic_dsc1_set_power(int on);
+#endif
diff --git a/drivers/media/pci/intel/Kconfig b/drivers/media/pci/intel/Kconfig
index 8ea99271932b..9017ccfc7a55 100644
--- a/drivers/media/pci/intel/Kconfig
+++ b/drivers/media/pci/intel/Kconfig
@@ -1,11 +1,12 @@
-config VIDEO_INTEL_IPU
+config VIDEO_INTEL_IPU6
 	tristate "Intel IPU driver"
 	depends on ACPI
 	depends on MEDIA_SUPPORT
 	depends on MEDIA_PCI_SUPPORT
+	depends on X86_64
 	select IOMMU_API
 	select IOMMU_IOVA
-	select X86_DEV_DMA_OPS if X86
+	select X86_DEV_DMA_OPS
 	select VIDEOBUF2_DMA_CONTIG
 	select V4L2_FWNODE
 	select PHYS_ADDR_T_64BIT
@@ -14,24 +15,12 @@ config VIDEO_INTEL_IPU
 	  This is the Intel imaging processing unit, found in Intel SoCs and
 	  used for capturing images and video from a camera sensor.
 
-	  To compile this driver, say Y here!
-
-choice
-	prompt "intel ipu generation type"
-	depends on VIDEO_INTEL_IPU
-	default VIDEO_INTEL_IPU6
-
-config VIDEO_INTEL_IPU6
-	bool "Compile for IPU6 driver"
-	help
-	  Sixth generation Intel imaging processing unit found in Intel
-	  SoCs.
-
-	  To compile this driver, say Y here!
-endchoice
+	  To compile this driver, say Y here! It contains 3 modules -
+	  intel_ipu6, intel_ipu6_isys and intel_ipu6_psys.
 
 config VIDEO_INTEL_IPU_TPG
 	bool "Compile for TPG driver"
+	depends on VIDEO_INTEL_IPU6
 	help
 	  If selected, TPG device nodes would be created.
 
@@ -40,18 +29,4 @@ config VIDEO_INTEL_IPU_TPG
 	  If you want to the TPG devices exposed to user as media entity,
 	  you must select this option, otherwise no.
 
-config VIDEO_INTEL_IPU_WERROR
-	bool "Force GCC to throw an error instead of a warning when compiling"
-	depends on VIDEO_INTEL_IPU
-	depends on EXPERT
-	depends on !COMPILE_TEST
-	default n
-	help
-	  Add -Werror to the build flags for (and only for) intel ipu module.
-	  Do not enable this unless you are writing code for the ipu module.
-
-	  Recommended for driver developers only.
-
-	  If in doubt, say "N".
-
 source "drivers/media/pci/intel/ipu3/Kconfig"
diff --git a/drivers/media/pci/intel/Makefile b/drivers/media/pci/intel/Makefile
index a0ccb70023e5..608acd574921 100644
--- a/drivers/media/pci/intel/Makefile
+++ b/drivers/media/pci/intel/Makefile
@@ -11,7 +11,5 @@ subdir-ccflags-y += $(call cc-disable-warning, implicit-fallthrough)
 subdir-ccflags-y += $(call cc-disable-warning, missing-field-initializers)
 subdir-ccflags-$(CONFIG_VIDEO_INTEL_IPU_WERROR) += -Werror
 
-obj-$(CONFIG_VIDEO_IPU3_CIO2) += ipu3/
-#obj-$(CONFIG_VIDEO_INTEL_IPU4)	 += ipu4/
-#obj-$(CONFIG_VIDEO_INTEL_IPU4P) += ipu4/
+obj-$(CONFIG_VIDEO_IPU3_CIO2)   += ipu3/
 obj-$(CONFIG_VIDEO_INTEL_IPU6)	+= ipu6/
diff --git a/drivers/media/pci/intel/ipu-buttress.c b/drivers/media/pci/intel/ipu-buttress.c
index 2ee8a9e554b6..ee014a8bea66 100644
--- a/drivers/media/pci/intel/ipu-buttress.c
+++ b/drivers/media/pci/intel/ipu-buttress.c
@@ -51,23 +51,6 @@
 
 #define BUTTRESS_IPC_CMD_SEND_RETRY	1
 
-static const struct ipu_buttress_sensor_clk_freq sensor_clk_freqs[] = {
-	{6750000, BUTTRESS_SENSOR_CLK_FREQ_6P75MHZ},
-	{8000000, BUTTRESS_SENSOR_CLK_FREQ_8MHZ},
-	{9600000, BUTTRESS_SENSOR_CLK_FREQ_9P6MHZ},
-	{12000000, BUTTRESS_SENSOR_CLK_FREQ_12MHZ},
-	{13600000, BUTTRESS_SENSOR_CLK_FREQ_13P6MHZ},
-	{14400000, BUTTRESS_SENSOR_CLK_FREQ_14P4MHZ},
-	{15800000, BUTTRESS_SENSOR_CLK_FREQ_15P8MHZ},
-	{16200000, BUTTRESS_SENSOR_CLK_FREQ_16P2MHZ},
-	{17300000, BUTTRESS_SENSOR_CLK_FREQ_17P3MHZ},
-	{18600000, BUTTRESS_SENSOR_CLK_FREQ_18P6MHZ},
-	{19200000, BUTTRESS_SENSOR_CLK_FREQ_19P2MHZ},
-	{24000000, BUTTRESS_SENSOR_CLK_FREQ_24MHZ},
-	{26000000, BUTTRESS_SENSOR_CLK_FREQ_26MHZ},
-	{27000000, BUTTRESS_SENSOR_CLK_FREQ_27MHZ}
-};
-
 static const u32 ipu_adev_irq_mask[] = {
 	BUTTRESS_ISR_IS_IRQ, BUTTRESS_ISR_PS_IRQ
 };
@@ -75,7 +58,7 @@ static const u32 ipu_adev_irq_mask[] = {
 int ipu_buttress_ipc_reset(struct ipu_device *isp, struct ipu_buttress_ipc *ipc)
 {
 	struct ipu_buttress *b = &isp->buttress;
-	unsigned int timeout = BUTTRESS_IPC_RESET_TIMEOUT;
+	unsigned int retries = BUTTRESS_IPC_RESET_TIMEOUT;
 	u32 val = 0, csr_in_clr;
 
 	if (!isp->secure_mode) {
@@ -103,7 +86,7 @@ int ipu_buttress_ipc_reset(struct ipu_device *isp, struct ipu_buttress_ipc *ipc)
 		BUTTRESS_IU2CSECSR_IPC_PEER_ACKED_REG_VALID |
 		BUTTRESS_IU2CSECSR_IPC_PEER_ASSERTED_REG_VALID_REQ | QUERY;
 
-	while (timeout--) {
+	while (retries--) {
 		usleep_range(400, 500);
 		val = readl(isp->base + ipc->csr_in);
 		switch (val) {
@@ -124,7 +107,7 @@ int ipu_buttress_ipc_reset(struct ipu_device *isp, struct ipu_buttress_ipc *ipc)
 			writel(QUERY, isp->base + ipc->csr_out);
 			break;
 		case ENTRY:
-		case ENTRY | QUERY:
+		case (ENTRY | QUERY):
 			dev_dbg(&isp->pdev->dev,
 				"%s:IPC_PEER_COMP_ACTIONS_RST_PHASE1\n",
 				__func__);
@@ -139,7 +122,7 @@ int ipu_buttress_ipc_reset(struct ipu_device *isp, struct ipu_buttress_ipc *ipc)
 			writel(ENTRY, isp->base + ipc->csr_out);
 			break;
 		case EXIT:
-		case EXIT | QUERY:
+		case (EXIT | QUERY):
 			dev_dbg(&isp->pdev->dev,
 				"%s: IPC_PEER_COMP_ACTIONS_RST_PHASE2\n",
 				__func__);
@@ -512,7 +495,8 @@ int ipu_buttress_power(struct device *dev,
 	} else {
 		val = BUTTRESS_FREQ_CTL_START |
 			ctrl->divisor << ctrl->divisor_shift |
-			ctrl->qos_floor << BUTTRESS_FREQ_CTL_QOS_FLOOR_SHIFT;
+			ctrl->qos_floor << BUTTRESS_FREQ_CTL_QOS_FLOOR_SHIFT |
+			BUTTRESS_FREQ_CTL_ICCMAX_LEVEL;
 
 		pwr_sts = ctrl->pwr_sts_on << ctrl->pwr_sts_shift;
 	}
@@ -629,6 +613,28 @@ static void ipu_buttress_set_psys_ratio(struct ipu_device *isp,
 	mutex_unlock(&isp->buttress.power_mutex);
 }
 
+static void ipu_buttress_set_isys_ratio(struct ipu_device *isp,
+					unsigned int isys_divisor)
+{
+	struct ipu_buttress_ctrl *ctrl = isp->isys->ctrl;
+
+	mutex_lock(&isp->buttress.power_mutex);
+
+	if (ctrl->divisor == isys_divisor)
+		goto out_mutex_unlock;
+
+	ctrl->divisor = isys_divisor;
+
+	if (ctrl->started) {
+		writel(BUTTRESS_FREQ_CTL_START |
+		       ctrl->qos_floor << BUTTRESS_FREQ_CTL_QOS_FLOOR_SHIFT |
+		       isys_divisor, isp->base + BUTTRESS_REG_IS_FREQ_CTL);
+	}
+
+out_mutex_unlock:
+	mutex_unlock(&isp->buttress.power_mutex);
+}
+
 static void ipu_buttress_set_psys_freq(struct ipu_device *isp,
 				       unsigned int freq)
 {
@@ -955,165 +961,6 @@ struct clk_ipu_sensor {
 
 #define to_clk_ipu_sensor(_hw) container_of(_hw, struct clk_ipu_sensor, hw)
 
-static int ipu_buttress_clk_pll_prepare(struct clk_hw *hw)
-{
-	struct clk_ipu_sensor *ck = to_clk_ipu_sensor(hw);
-	int ret;
-
-	/* Workaround needed to get sensor clock running in some cases */
-	ret = pm_runtime_get_sync(&ck->isp->isys->dev);
-	return ret >= 0 ? 0 : ret;
-}
-
-static void ipu_buttress_clk_pll_unprepare(struct clk_hw *hw)
-{
-	struct clk_ipu_sensor *ck = to_clk_ipu_sensor(hw);
-
-	/* Workaround needed to get sensor clock stopped in some cases */
-	pm_runtime_put(&ck->isp->isys->dev);
-}
-
-static int ipu_buttress_clk_pll_enable(struct clk_hw *hw)
-{
-	struct clk_ipu_sensor *ck = to_clk_ipu_sensor(hw);
-	u32 val;
-	unsigned int i;
-
-	/*
-	 * Start bit behaves like master clock request towards ICLK.
-	 * It is needed regardless of the 24 MHz or per clock out pll
-	 * setting.
-	 */
-	val = readl(ck->isp->base + BUTTRESS_REG_SENSOR_FREQ_CTL);
-	val |= BUTTRESS_FREQ_CTL_START;
-	val &= ~BUTTRESS_SENSOR_FREQ_CTL_OSC_OUT_FREQ_MASK(ck->id);
-	for (i = 0; i < ARRAY_SIZE(sensor_clk_freqs); i++)
-		if (sensor_clk_freqs[i].rate == ck->rate)
-			break;
-
-	if (i < ARRAY_SIZE(sensor_clk_freqs))
-		val |= sensor_clk_freqs[i].val <<
-		    BUTTRESS_SENSOR_FREQ_CTL_OSC_OUT_FREQ_SHIFT(ck->id);
-	else
-		val |= BUTTRESS_SENSOR_FREQ_CTL_OSC_OUT_FREQ_DEFAULT(ck->id);
-
-	writel(val, ck->isp->base + BUTTRESS_REG_SENSOR_FREQ_CTL);
-
-	return 0;
-}
-
-static void ipu_buttress_clk_pll_disable(struct clk_hw *hw)
-{
-	struct clk_ipu_sensor *ck = to_clk_ipu_sensor(hw);
-	u32 val;
-	int i;
-
-	val = readl(ck->isp->base + BUTTRESS_REG_SENSOR_CLK_CTL);
-	for (i = 0; i < IPU_BUTTRESS_NUM_OF_SENS_CKS; i++) {
-		if (val &
-		    (1 << BUTTRESS_SENSOR_CLK_CTL_OSC_CLK_OUT_EN_SHIFT(i)))
-			return;
-	}
-
-	/* See enable control above */
-	val = readl(ck->isp->base + BUTTRESS_REG_SENSOR_FREQ_CTL);
-	val &= ~BUTTRESS_FREQ_CTL_START;
-	writel(val, ck->isp->base + BUTTRESS_REG_SENSOR_FREQ_CTL);
-}
-
-static int ipu_buttress_clk_enable(struct clk_hw *hw)
-{
-	struct clk_ipu_sensor *ck = to_clk_ipu_sensor(hw);
-	u32 val;
-
-	val = readl(ck->isp->base + BUTTRESS_REG_SENSOR_CLK_CTL);
-	val |= 1 << BUTTRESS_SENSOR_CLK_CTL_OSC_CLK_OUT_EN_SHIFT(ck->id);
-
-	/* Enable dynamic sensor clock */
-	val |= 1 << BUTTRESS_SENSOR_CLK_CTL_OSC_CLK_OUT_SEL_SHIFT(ck->id);
-	writel(val, ck->isp->base + BUTTRESS_REG_SENSOR_CLK_CTL);
-
-	return 0;
-}
-
-static void ipu_buttress_clk_disable(struct clk_hw *hw)
-{
-	struct clk_ipu_sensor *ck = to_clk_ipu_sensor(hw);
-	u32 val;
-
-	val = readl(ck->isp->base + BUTTRESS_REG_SENSOR_CLK_CTL);
-	val &= ~(1 << BUTTRESS_SENSOR_CLK_CTL_OSC_CLK_OUT_EN_SHIFT(ck->id));
-	writel(val, ck->isp->base + BUTTRESS_REG_SENSOR_CLK_CTL);
-}
-
-static long ipu_buttress_clk_round_rate(struct clk_hw *hw,
-					unsigned long rate,
-					unsigned long *parent_rate)
-{
-	unsigned long best = ULONG_MAX;
-	unsigned long round_rate = 0;
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(sensor_clk_freqs); i++) {
-		long diff = sensor_clk_freqs[i].rate - rate;
-
-		if (diff == 0)
-			return rate;
-
-		diff = abs(diff);
-		if (diff < best) {
-			best = diff;
-			round_rate = sensor_clk_freqs[i].rate;
-		}
-	}
-
-	return round_rate;
-}
-
-static unsigned long
-ipu_buttress_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
-{
-	struct clk_ipu_sensor *ck = to_clk_ipu_sensor(hw);
-
-	return ck->rate;
-}
-
-static int ipu_buttress_clk_set_rate(struct clk_hw *hw,
-				     unsigned long rate,
-				     unsigned long parent_rate)
-{
-	struct clk_ipu_sensor *ck = to_clk_ipu_sensor(hw);
-
-	/*
-	 * R    N       P       PVD     PLLout
-	 * 1    45      128     2       6.75
-	 * 1    40      96      2       8
-	 * 1    40      80      2       9.6
-	 * 1    15      20      4       14.4
-	 * 1    40      32      2       24
-	 * 1    65      48      1       26
-	 *
-	 */
-	ck->rate = rate;
-
-	return 0;
-}
-
-static const struct clk_ops ipu_buttress_clk_sensor_ops = {
-	.enable = ipu_buttress_clk_enable,
-	.disable = ipu_buttress_clk_disable,
-};
-
-static const struct clk_ops ipu_buttress_clk_sensor_ops_parent = {
-	.enable = ipu_buttress_clk_pll_enable,
-	.disable = ipu_buttress_clk_pll_disable,
-	.prepare = ipu_buttress_clk_pll_prepare,
-	.unprepare = ipu_buttress_clk_pll_unprepare,
-	.round_rate = ipu_buttress_clk_round_rate,
-	.recalc_rate = ipu_buttress_clk_recalc_rate,
-	.set_rate = ipu_buttress_clk_set_rate,
-};
-
 int ipu_buttress_tsc_read(struct ipu_device *isp, u64 *val)
 {
 	struct ipu_buttress *b = &isp->buttress;
@@ -1265,6 +1112,54 @@ static int ipu_buttress_psys_force_freq_set(void *data, u64 val)
 	return 0;
 }
 
+int ipu_buttress_isys_freq_get(void *data, u64 *val)
+{
+	struct ipu_device *isp = data;
+	u32 reg_val;
+	int rval;
+
+	rval = pm_runtime_get_sync(&isp->isys->dev);
+	if (rval < 0) {
+		pm_runtime_put(&isp->isys->dev);
+		dev_err(&isp->pdev->dev, "Runtime PM failed (%d)\n", rval);
+		return rval;
+	}
+
+	reg_val = readl(isp->base + BUTTRESS_REG_IS_FREQ_CTL);
+
+	pm_runtime_put(&isp->isys->dev);
+
+	*val = IPU_IS_FREQ_RATIO_BASE *
+	    (reg_val & IPU_BUTTRESS_IS_FREQ_CTL_DIVISOR_MASK);
+
+	return 0;
+}
+
+int ipu_buttress_isys_freq_set(void *data, u64 val)
+{
+	struct ipu_device *isp = data;
+	int rval;
+
+	if (val < BUTTRESS_MIN_FORCE_IS_FREQ ||
+	    val > BUTTRESS_MAX_FORCE_IS_FREQ)
+		return -EINVAL;
+
+	rval = pm_runtime_get_sync(&isp->isys->dev);
+	if (rval < 0) {
+		pm_runtime_put(&isp->isys->dev);
+		dev_err(&isp->pdev->dev, "Runtime PM failed (%d)\n", rval);
+		return rval;
+	}
+
+	do_div(val, BUTTRESS_IS_FREQ_STEP);
+	if (val)
+		ipu_buttress_set_isys_ratio(isp, val);
+
+	pm_runtime_put(&isp->isys->dev);
+
+	return 0;
+}
+
 DEFINE_SIMPLE_ATTRIBUTE(ipu_buttress_psys_force_freq_fops,
 			ipu_buttress_psys_force_freq_get,
 			ipu_buttress_psys_force_freq_set, "%llu\n");
@@ -1273,7 +1168,8 @@ DEFINE_SIMPLE_ATTRIBUTE(ipu_buttress_psys_freq_fops,
 			ipu_buttress_psys_freq_get, NULL, "%llu\n");
 
 DEFINE_SIMPLE_ATTRIBUTE(ipu_buttress_isys_freq_fops,
-			ipu_buttress_isys_freq_get, NULL, "%llu\n");
+			ipu_buttress_isys_freq_get,
+			ipu_buttress_isys_freq_set, "%llu\n");
 
 int ipu_buttress_debugfs_init(struct ipu_device *isp)
 {
@@ -1318,7 +1214,7 @@ int ipu_buttress_debugfs_init(struct ipu_device *isp)
 	if (!file)
 		goto err;
 
-	file = debugfs_create_file("isys_freq", 0400, dir, isp,
+	file = debugfs_create_file("isys_freq", 0700, dir, isp,
 				   &ipu_buttress_isys_freq_fops);
 	if (!file)
 		goto err;
diff --git a/drivers/media/pci/intel/ipu-buttress.h b/drivers/media/pci/intel/ipu-buttress.h
index 02c8b46947a1..e1d054c3cd07 100644
--- a/drivers/media/pci/intel/ipu-buttress.h
+++ b/drivers/media/pci/intel/ipu-buttress.h
@@ -18,6 +18,10 @@
 #define BUTTRESS_MIN_FORCE_PS_FREQ	(BUTTRESS_PS_FREQ_STEP * 8)
 #define BUTTRESS_MAX_FORCE_PS_FREQ	(BUTTRESS_PS_FREQ_STEP * 32)
 
+#define BUTTRESS_IS_FREQ_STEP		25U
+#define BUTTRESS_MIN_FORCE_IS_FREQ	(BUTTRESS_IS_FREQ_STEP * 8)
+#define BUTTRESS_MAX_FORCE_IS_FREQ	(BUTTRESS_IS_FREQ_STEP * 16)
+
 struct ipu_buttress_ctrl {
 	u32 freq_ctl, pwr_sts_shift, pwr_sts_mask, pwr_sts_on, pwr_sts_off;
 	union {
@@ -122,5 +126,4 @@ void ipu_buttress_csi_port_config(struct ipu_device *isp,
 int ipu_buttress_restore(struct ipu_device *isp);
 
 int ipu_buttress_psys_freq_get(void *data, u64 *val);
-int ipu_buttress_isys_freq_get(void *data, u64 *val);
 #endif /* IPU_BUTTRESS_H */
diff --git a/drivers/media/pci/intel/ipu-dma.c b/drivers/media/pci/intel/ipu-dma.c
index 34fa1fb6b060..2e844dd16e61 100644
--- a/drivers/media/pci/intel/ipu-dma.c
+++ b/drivers/media/pci/intel/ipu-dma.c
@@ -11,7 +11,9 @@
 #include <linux/iova.h>
 #include <linux/module.h>
 #include <linux/scatterlist.h>
+#include <linux/version.h>
 #include <linux/vmalloc.h>
+#include <linux/dma-map-ops.h>
 
 #include "ipu-dma.h"
 #include "ipu-bus.h"
diff --git a/drivers/media/pci/intel/ipu-fw-isys.c b/drivers/media/pci/intel/ipu-fw-isys.c
index 974c6f59d34d..307117818a52 100644
--- a/drivers/media/pci/intel/ipu-fw-isys.c
+++ b/drivers/media/pci/intel/ipu-fw-isys.c
@@ -643,6 +643,8 @@ ipu_fw_isys_dump_stream_cfg(struct device *dev,
 			stream_cfg->output_pins[i].output_res.height);
 		dev_dbg(dev, "Stride %d\n", stream_cfg->output_pins[i].stride);
 		dev_dbg(dev, "Pin type %d\n", stream_cfg->output_pins[i].pt);
+		dev_dbg(dev, "Payload %d\n",
+			stream_cfg->output_pins[i].payload_buf_size);
 		dev_dbg(dev, "Ft %d\n", stream_cfg->output_pins[i].ft);
 		dev_dbg(dev, "Watermar in lines %d\n",
 			stream_cfg->output_pins[i].watermark_in_lines);
diff --git a/drivers/media/pci/intel/ipu-isys-csi2-be-soc.c b/drivers/media/pci/intel/ipu-isys-csi2-be-soc.c
index db90680e736d..501d5620e7e1 100644
--- a/drivers/media/pci/intel/ipu-isys-csi2-be-soc.c
+++ b/drivers/media/pci/intel/ipu-isys-csi2-be-soc.c
@@ -50,6 +50,17 @@ static struct v4l2_subdev_internal_ops csi2_be_soc_sd_internal_ops = {
 static const struct v4l2_subdev_core_ops csi2_be_soc_sd_core_ops = {
 };
 
+static const struct v4l2_ctrl_config compression_ctrl_cfg = {
+	.ops = NULL,
+	.id = V4L2_CID_IPU_ISYS_COMPRESSION,
+	.name = "ISYS BE-SOC compression",
+	.type = V4L2_CTRL_TYPE_BOOLEAN,
+	.min = 0,
+	.max = 1,
+	.step = 1,
+	.def = 0,
+};
+
 static int set_stream(struct v4l2_subdev *sd, int enable)
 {
 	return 0;
@@ -164,6 +175,7 @@ void ipu_isys_csi2_be_soc_cleanup(struct ipu_isys_csi2_be_soc *csi2_be_soc)
 {
 	v4l2_device_unregister_subdev(&csi2_be_soc->asd.sd);
 	ipu_isys_subdev_cleanup(&csi2_be_soc->asd);
+	v4l2_ctrl_handler_free(&csi2_be_soc->av.ctrl_handler);
 	ipu_isys_video_cleanup(&csi2_be_soc->av);
 }
 
@@ -242,6 +254,26 @@ int ipu_isys_csi2_be_soc_init(struct ipu_isys_csi2_be_soc *csi2_be_soc,
 	csi2_be_soc->av.aq.vbq.buf_struct_size =
 		sizeof(struct ipu_isys_video_buffer);
 
+	/* create v4l2 ctrl for be-soc video node */
+	rval = v4l2_ctrl_handler_init(&csi2_be_soc->av.ctrl_handler, 0);
+	if (rval) {
+		dev_err(&isys->adev->dev,
+			"failed to init v4l2 ctrl handler for be_soc\n");
+		goto fail;
+	}
+
+	csi2_be_soc->av.compression_ctrl =
+		v4l2_ctrl_new_custom(&csi2_be_soc->av.ctrl_handler,
+				     &compression_ctrl_cfg, NULL);
+	if (!csi2_be_soc->av.compression_ctrl) {
+		dev_err(&isys->adev->dev,
+			"failed to create BE-SOC cmprs ctrl\n");
+		goto fail;
+	}
+	csi2_be_soc->av.compression = 0;
+	csi2_be_soc->av.vdev.ctrl_handler =
+		&csi2_be_soc->av.ctrl_handler;
+
 	rval = ipu_isys_video_init(&csi2_be_soc->av,
 				   &csi2_be_soc->asd.sd.entity,
 				   CSI2_BE_SOC_PAD_SOURCE,
diff --git a/drivers/media/pci/intel/ipu-isys-csi2-be.c b/drivers/media/pci/intel/ipu-isys-csi2-be.c
index 9aae37af8011..99ceb607feda 100644
--- a/drivers/media/pci/intel/ipu-isys-csi2-be.c
+++ b/drivers/media/pci/intel/ipu-isys-csi2-be.c
@@ -48,6 +48,17 @@ static struct v4l2_subdev_internal_ops csi2_be_sd_internal_ops = {
 static const struct v4l2_subdev_core_ops csi2_be_sd_core_ops = {
 };
 
+static const struct v4l2_ctrl_config compression_ctrl_cfg = {
+	.ops = NULL,
+	.id = V4L2_CID_IPU_ISYS_COMPRESSION,
+	.name = "ISYS CSI-BE compression",
+	.type = V4L2_CTRL_TYPE_BOOLEAN,
+	.min = 0,
+	.max = 1,
+	.step = 1,
+	.def = 0,
+};
+
 static int set_stream(struct v4l2_subdev *sd, int enable)
 {
 	return 0;
@@ -201,6 +212,7 @@ static void csi2_be_set_ffmt(struct v4l2_subdev *sd,
 
 void ipu_isys_csi2_be_cleanup(struct ipu_isys_csi2_be *csi2_be)
 {
+	v4l2_ctrl_handler_free(&csi2_be->av.ctrl_handler);
 	v4l2_device_unregister_subdev(&csi2_be->asd.sd);
 	ipu_isys_subdev_cleanup(&csi2_be->asd);
 	ipu_isys_video_cleanup(&csi2_be->av);
@@ -278,6 +290,25 @@ int ipu_isys_csi2_be_init(struct ipu_isys_csi2_be *csi2_be,
 	csi2_be->av.aq.vbq.buf_struct_size =
 	    sizeof(struct ipu_isys_video_buffer);
 
+	/* create v4l2 ctrl for csi-be video node */
+	rval = v4l2_ctrl_handler_init(&csi2_be->av.ctrl_handler, 0);
+	if (rval) {
+		dev_err(&isys->adev->dev,
+			"failed to init v4l2 ctrl handler for csi2_be\n");
+		goto fail;
+	}
+
+	csi2_be->av.compression_ctrl =
+		v4l2_ctrl_new_custom(&csi2_be->av.ctrl_handler,
+				     &compression_ctrl_cfg, NULL);
+	if (!csi2_be->av.compression_ctrl) {
+		dev_err(&isys->adev->dev,
+			"failed to create CSI-BE cmprs ctrl\n");
+		goto fail;
+	}
+	csi2_be->av.compression = 0;
+	csi2_be->av.vdev.ctrl_handler = &csi2_be->av.ctrl_handler;
+
 	rval = ipu_isys_video_init(&csi2_be->av, &csi2_be->asd.sd.entity,
 				   CSI2_BE_PAD_SOURCE, MEDIA_PAD_FL_SINK, 0);
 	if (rval) {
diff --git a/drivers/media/pci/intel/ipu-isys-queue.c b/drivers/media/pci/intel/ipu-isys-queue.c
index 10498dddaf09..1f379f0464a1 100644
--- a/drivers/media/pci/intel/ipu-isys-queue.c
+++ b/drivers/media/pci/intel/ipu-isys-queue.c
@@ -336,6 +336,10 @@ ipu_isys_buffer_to_fw_frame_buff_pin(struct vb2_buffer *vb,
 				     struct ipu_fw_isys_frame_buff_set_abi *set)
 {
 	struct ipu_isys_queue *aq = vb2_queue_to_ipu_isys_queue(vb->vb2_queue);
+	struct ipu_isys_video *av = container_of(aq, struct ipu_isys_video, aq);
+
+	if (av->compression)
+		set->output_pins[aq->fw_output].compress = 1;
 
 	set->output_pins[aq->fw_output].addr =
 	    vb2_dma_contig_plane_dma_addr(vb, 0);
diff --git a/drivers/media/pci/intel/ipu-isys-video.c b/drivers/media/pci/intel/ipu-isys-video.c
index a4088b30c144..d1c76ee4c3de 100644
--- a/drivers/media/pci/intel/ipu-isys-video.c
+++ b/drivers/media/pci/intel/ipu-isys-video.c
@@ -154,7 +154,7 @@ static int video_open(struct file *file)
 	if (rval)
 		goto out_power_down;
 
-	rval = v4l2_pipeline_pm_use(&av->vdev.entity, 1);
+	rval = v4l2_pipeline_pm_get(&av->vdev.entity);
 	if (rval)
 		goto out_v4l2_fh_release;
 
@@ -199,7 +199,7 @@ static int video_open(struct file *file)
 out_lib_init:
 	isys->video_opened--;
 	mutex_unlock(&isys->mutex);
-	v4l2_pipeline_pm_use(&av->vdev.entity, 0);
+	v4l2_pipeline_pm_put(&av->vdev.entity);
 
 out_v4l2_fh_release:
 	v4l2_fh_release(file);
@@ -228,7 +228,7 @@ static int video_release(struct file *file)
 
 	mutex_unlock(&av->isys->mutex);
 
-	v4l2_pipeline_pm_use(&av->vdev.entity, 0);
+	v4l2_pipeline_pm_put(&av->vdev.entity);
 
 	if (av->isys->reset_needed)
 		pm_runtime_put_sync(&av->isys->adev->dev);
@@ -418,6 +418,43 @@ ipu_isys_video_try_fmt_vid_mplane(struct ipu_isys_video *av,
 		    max(mpix->plane_fmt[0].bytesperline,
 			av->isys->pdata->ipdata->isys_dma_overshoot)), 1U);
 
+	if (av->compression_ctrl)
+		av->compression = v4l2_ctrl_g_ctrl(av->compression_ctrl);
+
+	/* overwrite bpl/height with compression alignment */
+	if (av->compression) {
+		u32 planar_tile_status_size, tile_status_size;
+
+		mpix->plane_fmt[0].bytesperline =
+		    ALIGN(mpix->plane_fmt[0].bytesperline,
+			  IPU_ISYS_COMPRESSION_LINE_ALIGN);
+		mpix->height = ALIGN(mpix->height,
+				     IPU_ISYS_COMPRESSION_HEIGHT_ALIGN);
+
+		mpix->plane_fmt[0].sizeimage =
+		    ALIGN(mpix->plane_fmt[0].bytesperline * mpix->height,
+			  IPU_ISYS_COMPRESSION_PAGE_ALIGN);
+
+		/* ISYS compression only for RAW and single plannar */
+		planar_tile_status_size =
+		    DIV_ROUND_UP_ULL((mpix->plane_fmt[0].bytesperline *
+				      mpix->height /
+				      IPU_ISYS_COMPRESSION_TILE_SIZE_BYTES) *
+				     IPU_ISYS_COMPRESSION_TILE_STATUS_BITS,
+				     BITS_PER_BYTE);
+		tile_status_size = ALIGN(planar_tile_status_size,
+					 IPU_ISYS_COMPRESSION_PAGE_ALIGN);
+
+		/* tile status buffer offsets relative to buffer base address */
+		av->ts_offsets[0] = mpix->plane_fmt[0].sizeimage;
+		mpix->plane_fmt[0].sizeimage += tile_status_size;
+
+		dev_dbg(&av->isys->adev->dev,
+			"cmprs: bpl:%d, height:%d img size:%d, ts_sz:%d\n",
+			mpix->plane_fmt[0].bytesperline, mpix->height,
+			av->ts_offsets[0], tile_status_size);
+	}
+
 	memset(mpix->plane_fmt[0].reserved, 0,
 	       sizeof(mpix->plane_fmt[0].reserved));
 
@@ -637,19 +674,17 @@ static int get_external_facing_format(struct ipu_isys_pipeline *ip,
 static void short_packet_queue_destroy(struct ipu_isys_pipeline *ip)
 {
 	struct ipu_isys_video *av = container_of(ip, struct ipu_isys_video, ip);
-	unsigned long attrs;
 	unsigned int i;
 
-	attrs = DMA_ATTR_NON_CONSISTENT;
 	if (!ip->short_packet_bufs)
 		return;
 	for (i = 0; i < IPU_ISYS_SHORT_PACKET_BUFFER_NUM; i++) {
 		if (ip->short_packet_bufs[i].buffer)
-			dma_free_attrs(&av->isys->adev->dev,
-				       ip->short_packet_buffer_size,
-				       ip->short_packet_bufs[i].buffer,
-				       ip->short_packet_bufs[i].dma_addr,
-				       attrs);
+			dma_free_noncoherent(&av->isys->adev->dev,
+					     ip->short_packet_buffer_size,
+					     ip->short_packet_bufs[i].buffer,
+					     ip->short_packet_bufs[i].dma_addr,
+					     DMA_BIDIRECTIONAL);
 	}
 	kfree(ip->short_packet_bufs);
 	ip->short_packet_bufs = NULL;
@@ -659,7 +694,6 @@ static int short_packet_queue_setup(struct ipu_isys_pipeline *ip)
 {
 	struct ipu_isys_video *av = container_of(ip, struct ipu_isys_video, ip);
 	struct v4l2_subdev_format source_fmt = { 0 };
-	unsigned long attrs;
 	unsigned int i;
 	int rval;
 	size_t buf_size;
@@ -683,7 +717,6 @@ static int short_packet_queue_setup(struct ipu_isys_pipeline *ip)
 	/* Initialize short packet queue. */
 	INIT_LIST_HEAD(&ip->short_packet_incoming);
 	INIT_LIST_HEAD(&ip->short_packet_active);
-	attrs = DMA_ATTR_NON_CONSISTENT;
 
 	ip->short_packet_bufs =
 	    kzalloc(sizeof(struct ipu_isys_private_buffer) *
@@ -698,9 +731,11 @@ static int short_packet_queue_setup(struct ipu_isys_pipeline *ip)
 		buf->ip = ip;
 		buf->ib.type = IPU_ISYS_SHORT_PACKET_BUFFER;
 		buf->bytesused = buf_size;
-		buf->buffer = dma_alloc_attrs(&av->isys->adev->dev, buf_size,
-					      &buf->dma_addr, GFP_KERNEL,
-					      attrs);
+		buf->buffer = dma_alloc_noncoherent(&av->isys->adev->dev,
+						    buf_size,
+						    &buf->dma_addr,
+						    DMA_BIDIRECTIONAL,
+						    GFP_KERNEL);
 		if (!buf->buffer) {
 			short_packet_queue_destroy(ip);
 			return -ENOMEM;
@@ -813,9 +848,30 @@ ipu_isys_prepare_fw_cfg_default(struct ipu_isys_video *av,
 		pin_info->snoopable = true;
 		pin_info->error_handling_enable = false;
 		break;
-	/* snoopable sensor data to CPU */
-	case IPU_FW_ISYS_PIN_TYPE_MIPI:
 	case IPU_FW_ISYS_PIN_TYPE_RAW_SOC:
+		if (av->compression) {
+			type_index = IPU_FW_ISYS_VC1_SENSOR_DATA;
+			pin_info->sensor_type
+				= isys->sensor_types[type_index]++;
+			pin_info->snoopable = false;
+			pin_info->error_handling_enable = false;
+			type = isys->sensor_types[type_index];
+			if (type > isys->sensor_info.vc1_data_end)
+				isys->sensor_types[type_index] =
+					isys->sensor_info.vc1_data_start;
+		} else {
+			type_index = IPU_FW_ISYS_VC0_SENSOR_DATA;
+			pin_info->sensor_type
+				= isys->sensor_types[type_index]++;
+			pin_info->snoopable = true;
+			pin_info->error_handling_enable = false;
+			type = isys->sensor_types[type_index];
+			if (type > isys->sensor_info.vc0_data_end)
+				isys->sensor_types[type_index] =
+					isys->sensor_info.vc0_data_start;
+		}
+		break;
+	case IPU_FW_ISYS_PIN_TYPE_MIPI:
 		type_index = IPU_FW_ISYS_VC0_SENSOR_DATA;
 		pin_info->sensor_type = isys->sensor_types[type_index]++;
 		pin_info->snoopable = true;
@@ -826,6 +882,7 @@ ipu_isys_prepare_fw_cfg_default(struct ipu_isys_video *av,
 				isys->sensor_info.vc0_data_start;
 
 		break;
+
 	default:
 		dev_err(&av->isys->adev->dev,
 			"Unknown pin type, use metadata type as default\n");
@@ -834,6 +891,11 @@ ipu_isys_prepare_fw_cfg_default(struct ipu_isys_video *av,
 		pin_info->snoopable = true;
 		pin_info->error_handling_enable = false;
 	}
+	if (av->compression) {
+		pin_info->payload_buf_size = av->mpix.plane_fmt[0].sizeimage;
+		pin_info->reserve_compression = av->compression;
+		pin_info->ts_offsets[0] = av->ts_offsets[0];
+	}
 }
 
 static unsigned int ipu_isys_get_compression_scheme(u32 code)
@@ -1660,7 +1722,7 @@ int ipu_isys_video_init(struct ipu_isys_video *av,
 
 	mutex_lock(&av->mutex);
 
-	rval = video_register_device(&av->vdev, VFL_TYPE_GRABBER, -1);
+	rval = video_register_device(&av->vdev, VFL_TYPE_VIDEO, -1);
 	if (rval)
 		goto out_media_entity_cleanup;
 
diff --git a/drivers/media/pci/intel/ipu-isys-video.h b/drivers/media/pci/intel/ipu-isys-video.h
index 455b534b41f7..6d8701d28843 100644
--- a/drivers/media/pci/intel/ipu-isys-video.h
+++ b/drivers/media/pci/intel/ipu-isys-video.h
@@ -121,6 +121,10 @@ struct ipu_isys_video {
 	struct ipu_isys_pipeline ip;
 	unsigned int streaming;
 	bool packed;
+	bool compression;
+	struct v4l2_ctrl_handler ctrl_handler;
+	struct v4l2_ctrl *compression_ctrl;
+	unsigned int ts_offsets[VIDEO_MAX_PLANES];
 	unsigned int line_header_length;	/* bits */
 	unsigned int line_footer_length;	/* bits */
 
diff --git a/drivers/media/pci/intel/ipu-isys.c b/drivers/media/pci/intel/ipu-isys.c
index 69043915fd43..a193d7ed041c 100644
--- a/drivers/media/pci/intel/ipu-isys.c
+++ b/drivers/media/pci/intel/ipu-isys.c
@@ -656,6 +656,7 @@ static int isys_register_devices(struct ipu_isys *isys)
 	rval = isys_notifier_init(isys);
 	if (rval)
 		goto out_isys_unregister_subdevices;
+
 	rval = v4l2_device_register_subdev_nodes(&isys->v4l2_dev);
 	if (rval)
 		goto out_isys_notifier_cleanup;
@@ -704,7 +705,7 @@ static int isys_runtime_pm_resume(struct device *dev)
 
 	ipu_trace_restore(dev);
 
-	pm_qos_update_request(&isys->pm_qos, ISYS_PM_QOS_VALUE);
+	cpu_latency_qos_update_request(&isys->pm_qos, ISYS_PM_QOS_VALUE);
 
 	ret = ipu_buttress_start_tsc_sync(isp);
 	if (ret)
@@ -743,7 +744,7 @@ static int isys_runtime_pm_suspend(struct device *dev)
 	isys->reset_needed = false;
 	mutex_unlock(&isys->mutex);
 
-	pm_qos_update_request(&isys->pm_qos, PM_QOS_DEFAULT_VALUE);
+	cpu_latency_qos_update_request(&isys->pm_qos, PM_QOS_DEFAULT_VALUE);
 
 	ipu_mmu_hw_cleanup(adev->mmu);
 
@@ -810,7 +811,8 @@ static void isys_remove(struct ipu_bus_device *adev)
 	ipu_trace_uninit(&adev->dev);
 	isys_notifier_cleanup(isys);
 	isys_unregister_devices(isys);
-	pm_qos_remove_request(&isys->pm_qos);
+
+	cpu_latency_qos_remove_request(&isys->pm_qos);
 
 	if (!isp->secure_mode) {
 		ipu_cpd_free_pkg_dir(adev, isys->pkg_dir,
@@ -825,12 +827,10 @@ static void isys_remove(struct ipu_bus_device *adev)
 
 	if (isys->short_packet_source == IPU_ISYS_SHORT_PACKET_FROM_TUNIT) {
 		u32 trace_size = IPU_ISYS_SHORT_PACKET_TRACE_BUFFER_SIZE;
-		unsigned long attrs;
-
-		attrs = DMA_ATTR_NON_CONSISTENT;
-		dma_free_attrs(&adev->dev, trace_size,
-			       isys->short_packet_trace_buffer,
-			       isys->short_packet_trace_buffer_dma_addr, attrs);
+		dma_free_noncoherent(&adev->dev, trace_size,
+				     isys->short_packet_trace_buffer,
+				     isys->short_packet_trace_buffer_dma_addr,
+				     DMA_BIDIRECTIONAL);
 	}
 }
 
@@ -1142,8 +1142,7 @@ static int isys_probe(struct ipu_bus_device *adev)
 	ipu_trace_init(adev->isp, isys->pdata->base, &adev->dev,
 		       isys_trace_blocks);
 
-	pm_qos_add_request(&isys->pm_qos, PM_QOS_CPU_DMA_LATENCY,
-			   PM_QOS_DEFAULT_VALUE);
+	cpu_latency_qos_add_request(&isys->pm_qos, PM_QOS_DEFAULT_VALUE);
 	alloc_fw_msg_bufs(isys, 20);
 
 	rval = isys_register_devices(isys);
diff --git a/drivers/media/pci/intel/ipu-mmu.c b/drivers/media/pci/intel/ipu-mmu.c
index f570d5e08eef..476ef7b5cc2e 100644
--- a/drivers/media/pci/intel/ipu-mmu.c
+++ b/drivers/media/pci/intel/ipu-mmu.c
@@ -455,7 +455,7 @@ int ipu_mmu_hw_init(struct ipu_mmu *mmu)
 }
 EXPORT_SYMBOL(ipu_mmu_hw_init);
 
-struct ipu_mmu_info *ipu_mmu_alloc(struct ipu_device *isp)
+static struct ipu_mmu_info *ipu_mmu_alloc(struct ipu_device *isp)
 {
 	struct ipu_mmu_info *mmu_info;
 	void *ptr;
@@ -551,7 +551,7 @@ phys_addr_t ipu_mmu_iova_to_phys(struct ipu_mmu_info *mmu_info,
 	    << ISP_PAGE_SHIFT;
 }
 
-/**
+/*
  * The following four functions are implemented based on iommu.c
  * drivers/iommu/iommu.c/iommu_pgsize().
  */
diff --git a/drivers/media/pci/intel/ipu-psys-compat32.c b/drivers/media/pci/intel/ipu-psys-compat32.c
index 5283c85bd57b..ba13127d946e 100644
--- a/drivers/media/pci/intel/ipu-psys-compat32.c
+++ b/drivers/media/pci/intel/ipu-psys-compat32.c
@@ -204,11 +204,10 @@ long ipu_psys_compat_ioctl32(struct file *file, unsigned int cmd,
 	if (compatible_arg) {
 		err = native_ioctl(file, cmd, (unsigned long)up);
 	} else {
-		mm_segment_t old_fs = get_fs();
+		mm_segment_t old_fs = force_uaccess_begin();
 
-		set_fs(KERNEL_DS);
 		err = native_ioctl(file, cmd, (unsigned long)&karg);
-		set_fs(old_fs);
+		force_uaccess_end(old_fs);
 	}
 
 	if (err)
diff --git a/drivers/media/pci/intel/ipu-psys.c b/drivers/media/pci/intel/ipu-psys.c
index 904884f244b3..0efed22ae8b8 100644
--- a/drivers/media/pci/intel/ipu-psys.c
+++ b/drivers/media/pci/intel/ipu-psys.c
@@ -162,7 +162,7 @@ static int ipu_psys_get_userpages(struct ipu_dma_buf_attach *attach)
 	if (!pages)
 		goto free_sgt;
 
-	down_read(&current->mm->mmap_sem);
+	mmap_read_lock(current->mm);
 	vma = find_vma(current->mm, start);
 	if (!vma) {
 		ret = -EFAULT;
@@ -201,7 +201,7 @@ static int ipu_psys_get_userpages(struct ipu_dma_buf_attach *attach)
 		if (nr < npages)
 			goto error_up_read;
 	}
-	up_read(&current->mm->mmap_sem);
+	mmap_read_unlock(current->mm);
 
 	attach->pages = pages;
 	attach->npages = npages;
@@ -218,7 +218,7 @@ static int ipu_psys_get_userpages(struct ipu_dma_buf_attach *attach)
 	return 0;
 
 error_up_read:
-	up_read(&current->mm->mmap_sem);
+	mmap_read_unlock(current->mm);
 error:
 	if (!attach->vma_is_io)
 		while (nr > 0)
@@ -364,8 +364,7 @@ static void *ipu_dma_buf_vmap(struct dma_buf *dmabuf)
 	if (!ipu_attach || !ipu_attach->pages || !ipu_attach->npages)
 		return NULL;
 
-	return vm_map_ram(ipu_attach->pages,
-			  ipu_attach->npages, 0, PAGE_KERNEL);
+	return vm_map_ram(ipu_attach->pages, ipu_attach->npages, 0);
 }
 
 static void ipu_dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr)
diff --git a/drivers/media/pci/intel/ipu-psys.h b/drivers/media/pci/intel/ipu-psys.h
index 61ff388f8458..7a1d7d42c98d 100644
--- a/drivers/media/pci/intel/ipu-psys.h
+++ b/drivers/media/pci/intel/ipu-psys.h
@@ -13,7 +13,7 @@
 #include "ipu-platform-psys.h"
 
 #define IPU_PSYS_PG_POOL_SIZE 16
-#define IPU_PSYS_PG_MAX_SIZE 2048
+#define IPU_PSYS_PG_MAX_SIZE 8192
 #define IPU_MAX_PSYS_CMD_BUFFERS 32
 #define IPU_PSYS_EVENT_CMD_COMPLETE IPU_FW_PSYS_EVENT_TYPE_SUCCESS
 #define IPU_PSYS_EVENT_FRAGMENT_COMPLETE IPU_FW_PSYS_EVENT_TYPE_SUCCESS
diff --git a/drivers/media/pci/intel/ipu-trace.c b/drivers/media/pci/intel/ipu-trace.c
index 10e4d5c68619..b3042993298a 100644
--- a/drivers/media/pci/intel/ipu-trace.c
+++ b/drivers/media/pci/intel/ipu-trace.c
@@ -160,10 +160,12 @@ static void __ipu_trace_restore(struct device *dev)
 
 	if (!sys->memory.memory_buffer) {
 		sys->memory.memory_buffer =
-		    dma_alloc_attrs(dev, MEMORY_RING_BUFFER_SIZE +
-				    MEMORY_RING_BUFFER_GUARD,
-				    &sys->memory.dma_handle,
-				    GFP_KERNEL, DMA_ATTR_NON_CONSISTENT);
+			dma_alloc_noncoherent(dev,
+					      MEMORY_RING_BUFFER_SIZE +
+					      MEMORY_RING_BUFFER_GUARD,
+					      &sys->memory.dma_handle,
+					      DMA_BIDIRECTIONAL,
+					      GFP_KERNEL);
 	}
 
 	if (!sys->memory.memory_buffer) {
@@ -810,11 +812,11 @@ void ipu_trace_uninit(struct device *dev)
 	mutex_lock(&trace->lock);
 
 	if (sys->memory.memory_buffer)
-		dma_free_attrs(sys->dev,
-			       MEMORY_RING_BUFFER_SIZE +
-			       MEMORY_RING_BUFFER_GUARD,
-			       sys->memory.memory_buffer,
-			       sys->memory.dma_handle, DMA_ATTR_NON_CONSISTENT);
+		dma_free_noncoherent(sys->dev,
+			MEMORY_RING_BUFFER_SIZE + MEMORY_RING_BUFFER_GUARD,
+			sys->memory.memory_buffer,
+			sys->memory.dma_handle,
+			DMA_BIDIRECTIONAL);
 
 	sys->dev = NULL;
 	sys->memory.memory_buffer = NULL;
diff --git a/drivers/media/pci/intel/ipu.c b/drivers/media/pci/intel/ipu.c
index 84f301c72571..40d7268615b1 100644
--- a/drivers/media/pci/intel/ipu.c
+++ b/drivers/media/pci/intel/ipu.c
@@ -47,6 +47,10 @@ static struct ipu_bus_device *ipu_isys_init(struct pci_dev *pdev,
 	pdata->base = base;
 	pdata->ipdata = ipdata;
 
+	/* Use 250MHz for ipu6 se */
+	if (ipu_ver == IPU_VER_6SE)
+		ctrl->ratio = IPU6SE_IS_FREQ_CTL_DEFAULT_RATIO;
+
 	isys = ipu_bus_add_device(pdev, parent, pdata, ctrl,
 				  IPU_ISYS_NAME, nr);
 	if (IS_ERR(isys))
@@ -430,6 +434,8 @@ static int ipu_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 		return rval;
 	}
 
+	dma_set_max_seg_size(&pdev->dev, UINT_MAX);
+
 	rval = ipu_pci_config_setup(pdev);
 	if (rval)
 		return rval;
diff --git a/drivers/media/pci/intel/ipu6/Makefile b/drivers/media/pci/intel/ipu6/Makefile
index d845028191e8..f2aeade54082 100644
--- a/drivers/media/pci/intel/ipu6/Makefile
+++ b/drivers/media/pci/intel/ipu6/Makefile
@@ -18,7 +18,7 @@ intel-ipu6-objs				+= ../ipu.o \
 					   ipu6.o \
 					   ../ipu-fw-com.o
 
-obj-$(CONFIG_VIDEO_INTEL_IPU)		+= intel-ipu6.o
+obj-$(CONFIG_VIDEO_INTEL_IPU6)		+= intel-ipu6.o
 
 intel-ipu6-isys-objs			+= ../ipu-isys.o \
 					   ../ipu-isys-csi2.o \
@@ -37,7 +37,7 @@ ifdef CONFIG_VIDEO_INTEL_IPU_TPG
 intel-ipu6-isys-objs                    += ../ipu-isys-tpg.o
 endif
 
-obj-$(CONFIG_VIDEO_INTEL_IPU)		+= intel-ipu6-isys.o
+obj-$(CONFIG_VIDEO_INTEL_IPU6)		+= intel-ipu6-isys.o
 
 intel-ipu6-psys-objs			+= ../ipu-psys.o \
 					   ipu6-psys.o \
@@ -55,7 +55,7 @@ ifeq ($(CONFIG_COMPAT),y)
 intel-ipu6-psys-objs			+= ../ipu-psys-compat32.o
 endif
 
-obj-$(CONFIG_VIDEO_INTEL_IPU)		+= intel-ipu6-psys.o
+obj-$(CONFIG_VIDEO_INTEL_IPU6)		+= intel-ipu6-psys.o
 
 ccflags-y += -I$(srcpath)/$(src)/../../../../../include/
 ccflags-y += -I$(srcpath)/$(src)/../
diff --git a/drivers/media/pci/intel/ipu6/ipu-platform-buttress-regs.h b/drivers/media/pci/intel/ipu6/ipu-platform-buttress-regs.h
index e91524c8e7f7..343d75bd4cc6 100644
--- a/drivers/media/pci/intel/ipu6/ipu-platform-buttress-regs.h
+++ b/drivers/media/pci/intel/ipu6/ipu-platform-buttress-regs.h
@@ -21,8 +21,9 @@
 #define IPU_BUTTRESS_PS_FREQ_CTL_DIVISOR_MASK	0xff
 
 /* should be tuned for real silicon */
-#define IPU_IS_FREQ_CTL_DEFAULT_RATIO	0x08
-#define IPU_PS_FREQ_CTL_DEFAULT_RATIO	0x10
+#define IPU_IS_FREQ_CTL_DEFAULT_RATIO		0x08
+#define IPU6SE_IS_FREQ_CTL_DEFAULT_RATIO	0x0a
+#define IPU_PS_FREQ_CTL_DEFAULT_RATIO		0x10
 
 #define IPU_IS_FREQ_CTL_DEFAULT_QOS_FLOOR_RATIO	0x10
 #define IPU_PS_FREQ_CTL_DEFAULT_QOS_FLOOR_RATIO	0x0708
@@ -69,6 +70,7 @@
 #define BUTTRESS_FREQ_CTL_START		BIT(31)
 #define BUTTRESS_FREQ_CTL_START_SHIFT		31
 #define BUTTRESS_FREQ_CTL_QOS_FLOOR_SHIFT	8
+#define BUTTRESS_FREQ_CTL_ICCMAX_LEVEL		(GENMASK(19, 16))
 #define BUTTRESS_FREQ_CTL_QOS_FLOOR_MASK	(0xff << 8)
 
 #define BUTTRESS_REG_PWR_STATE	0x5c
diff --git a/drivers/media/pci/intel/ipu6/ipu-platform-isys.h b/drivers/media/pci/intel/ipu6/ipu-platform-isys.h
index 886947870387..82ca971cd996 100644
--- a/drivers/media/pci/intel/ipu6/ipu-platform-isys.h
+++ b/drivers/media/pci/intel/ipu6/ipu-platform-isys.h
@@ -15,4 +15,12 @@
 				 IPU_ISYS_UNISPART_IRQ_CSI0 |	\
 				 IPU_ISYS_UNISPART_IRQ_CSI1)
 
+/* IPU6 ISYS compression alignment */
+#define IPU_ISYS_COMPRESSION_LINE_ALIGN		512
+#define IPU_ISYS_COMPRESSION_HEIGHT_ALIGN	1
+#define IPU_ISYS_COMPRESSION_TILE_SIZE_BYTES	512
+#define IPU_ISYS_COMPRESSION_PAGE_ALIGN		0x1000
+#define IPU_ISYS_COMPRESSION_TILE_STATUS_BITS	4
+#define IPU_ISYS_COMPRESSION_MAX		3
+
 #endif
diff --git a/drivers/media/pci/intel/ipu6/ipu-platform-psys.h b/drivers/media/pci/intel/ipu6/ipu-platform-psys.h
index 5573e617d2b9..e44eaf3b580f 100644
--- a/drivers/media/pci/intel/ipu6/ipu-platform-psys.h
+++ b/drivers/media/pci/intel/ipu6/ipu-platform-psys.h
@@ -69,7 +69,8 @@ struct ipu_psys_buffer_set {
 };
 
 int ipu_psys_kcmd_start(struct ipu_psys *psys, struct ipu_psys_kcmd *kcmd);
-void ipu_psys_kcmd_complete(struct ipu_psys_ppg *kppg, struct ipu_psys_kcmd *kcmd,
+void ipu_psys_kcmd_complete(struct ipu_psys_ppg *kppg,
+			    struct ipu_psys_kcmd *kcmd,
 			    int error);
 int ipu_psys_fh_init(struct ipu_psys_fh *fh);
 int ipu_psys_fh_deinit(struct ipu_psys_fh *fh);
diff --git a/drivers/media/pci/intel/ipu6/ipu-resources.c b/drivers/media/pci/intel/ipu6/ipu-resources.c
index 418dd55c1e3a..5a2dd03a85c5 100644
--- a/drivers/media/pci/intel/ipu6/ipu-resources.c
+++ b/drivers/media/pci/intel/ipu6/ipu-resources.c
@@ -242,7 +242,6 @@ static int __alloc_one_resrc(const struct device *dev,
 	const u16 resource_req = pm->dev_chn_size[resource_id];
 	const u16 resource_offset_req = pm->dev_chn_offset[resource_id];
 	unsigned long retl;
-	const struct ipu_fw_resource_definitions *res_defs;
 
 	if (resource_req <= 0)
 		return 0;
@@ -251,7 +250,6 @@ static int __alloc_one_resrc(const struct device *dev,
 		dev_err(dev, "out of resource handles\n");
 		return -ENOSPC;
 	}
-	res_defs = get_res();
 	if (resource_offset_req != (u16)(-1))
 		retl = ipu_resource_alloc_with_pos
 		    (resource,
diff --git a/drivers/media/pci/intel/ipu6/ipu6-fw-resources.c b/drivers/media/pci/intel/ipu6/ipu6-fw-resources.c
index 6c2885a3d564..4b646783704d 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-fw-resources.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-fw-resources.c
@@ -426,24 +426,6 @@ const struct ipu_fw_resource_definitions *ipu6_res_defs = &ipu6_defs;
 
 /********** Generic resource handling **********/
 
-/*
- * Extension library gives byte offsets to its internal structures.
- * use those offsets to update fields. Without extension lib access
- * structures directly.
- */
-int ipu6_fw_psys_set_process_cell_id(struct ipu_fw_psys_process *ptr, u8 index,
-				     u8 value)
-{
-	struct ipu_fw_psys_process_group *parent =
-		(struct ipu_fw_psys_process_group *)((char *)ptr +
-						      ptr->parent_offset);
-
-	ptr->cells[index] = value;
-	parent->resource_bitmap |= 1 << value;
-
-	return 0;
-}
-
 int ipu6_fw_psys_set_proc_dev_chn(struct ipu_fw_psys_process *ptr, u16 offset,
 				  u16 value)
 {
@@ -565,7 +547,6 @@ void ipu6_fw_psys_pg_dump(struct ipu_psys *psys,
 	u8 processes = pg->process_count;
 	u16 *process_offset_table = (u16 *)((char *)pg + pg->processes_offset);
 	unsigned int p, chn, mem, mem_id;
-	int cell;
 
 	dev_dbg(&psys->adev->dev, "%s %s pgid %i has %i processes:\n",
 		__func__, note, pgid, processes);
@@ -577,7 +558,6 @@ void ipu6_fw_psys_pg_dump(struct ipu_psys *psys,
 		struct ipu6_fw_psys_process_ext *pm_ext =
 		    (struct ipu6_fw_psys_process_ext *)((u8 *)process
 		    + process->process_extension_offset);
-		cell = process->cells[0];
 		dev_dbg(&psys->adev->dev, "\t process %i size=%u",
 			p, process->size);
 		if (!process->process_extension_offset)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
index afd84e5ca814..86d895e0640c 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
@@ -355,7 +355,7 @@ int ipu_isys_csi2_set_stream(struct v4l2_subdev *sd,
 		IPU6SE_CSI_RX_ERROR_IRQ_MASK;
 
 	if (!enable) {
-		ipu_isys_csi2_error(csi2);
+
 		writel(0, csi2->base + CSI_REG_CSI_FE_ENABLE);
 		writel(0, csi2->base + CSI_REG_PPI2CSI_ENABLE);
 
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-gpc.c b/drivers/media/pci/intel/ipu6/ipu6-isys-gpc.c
index 227a5ba9ed03..bd8044255efe 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-gpc.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-gpc.c
@@ -178,20 +178,14 @@ int ipu_isys_gpc_init_debugfs(struct ipu_isys *isys)
 		if (IS_ERR(file))
 			goto err;
 
-		file = debugfs_create_u32("source", 0600, dir,
-					  &isys_gpcs->gpc[i].source);
-		if (IS_ERR(file))
-			goto err;
+		debugfs_create_u32("source", 0600, dir,
+				   &isys_gpcs->gpc[i].source);
 
-		file = debugfs_create_u32("route", 0600, dir,
-					  &isys_gpcs->gpc[i].route);
-		if (IS_ERR(file))
-			goto err;
+		debugfs_create_u32("route", 0600, dir,
+				   &isys_gpcs->gpc[i].route);
 
-		file = debugfs_create_u32("sense", 0600, dir,
-					  &isys_gpcs->gpc[i].sense);
-		if (IS_ERR(file))
-			goto err;
+		debugfs_create_u32("sense", 0600, dir,
+				   &isys_gpcs->gpc[i].sense);
 
 		isys_gpcs->gpc[i].gpcindex = i;
 		isys_gpcs->gpc[i].prit = isys;
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-phy.c b/drivers/media/pci/intel/ipu6/ipu6-isys-phy.c
index 82d457fc8d64..a1165e718def 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-phy.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-phy.c
@@ -555,7 +555,8 @@ static int ipu6_isys_driver_port_to_phy_port(struct ipu_isys_csi2_config *cfg)
 
 int ipu6_isys_phy_config(struct ipu_isys *isys)
 {
-	unsigned int phy_port, phy_id;
+	int phy_port;
+	unsigned int phy_id;
 	void __iomem *phy_base;
 	struct ipu_bus_device *adev = to_ipu_bus_device(&isys->adev->dev);
 	struct ipu_device *isp = adev->isp;
@@ -592,23 +593,3 @@ int ipu6_isys_phy_config(struct ipu_isys *isys)
 
 	return 0;
 }
-
-void __maybe_unused ipu6_isys_phy_dump_status(struct ipu_isys *isys,
-					      struct ipu_isys_csi2_config *cfg)
-{
-	unsigned int port, phy_id, nlanes;
-	struct ipu_bus_device *adev = to_ipu_bus_device(&isys->adev->dev);
-	struct ipu_device *isp = adev->isp;
-	void __iomem *isp_base = isp->base;
-	void __iomem *cbbs1_base;
-
-	port = cfg->port;
-	phy_id = port / 4;
-	nlanes = cfg->nlanes;
-	cbbs1_base = isp_base + IPU6_ISYS_PHY_BASE(phy_id) + PHY_CBBS1_BASE;
-
-	dev_dbg(&isys->adev->dev, "phy rcomp_status 0x%08x, cbb_status 0x%08x",
-		readl(cbbs1_base + PHY_CBBS1_RCOMP_STATUS_REG_1),
-		readl(cbbs1_base + PHY_CBBS1_CBB_STATUS_REG));
-
-}
diff --git a/drivers/media/pci/intel/ipu6/ipu6-l-scheduler.c b/drivers/media/pci/intel/ipu6/ipu6-l-scheduler.c
index eed5022b88d3..3d3cd0c0841f 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-l-scheduler.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-l-scheduler.c
@@ -145,7 +145,7 @@ static int ipu_psys_detect_resource_contention(struct ipu_psys_ppg *kppg)
 
 static void ipu_psys_scheduler_ppg_sort(struct ipu_psys *psys, bool *stopping)
 {
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 	struct ipu_psys_scheduler *sched;
 	struct ipu_psys_fh *fh;
 
@@ -158,7 +158,7 @@ static void ipu_psys_scheduler_ppg_sort(struct ipu_psys *psys, bool *stopping)
 			continue;
 		}
 
-		list_for_each_entry(kppg, &sched->ppgs, list) {
+		list_for_each_entry_safe(kppg, tmp, &sched->ppgs, list) {
 			mutex_lock(&kppg->mutex);
 			if (kppg->state == PPG_STATE_START ||
 			    kppg->state == PPG_STATE_RESUME) {
@@ -184,11 +184,11 @@ static void ipu_psys_scheduler_ppg_sort(struct ipu_psys *psys, bool *stopping)
 static void ipu_psys_scheduler_update_start_ppg_priority(void)
 {
 	struct sched_list *sc_list = get_sc_list(SCHED_START_LIST);
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 
 	mutex_lock(&sc_list->lock);
 	if (!list_empty(&sc_list->list))
-		list_for_each_entry(kppg, &sc_list->list, sched_list)
+		list_for_each_entry_safe(kppg, tmp, &sc_list->list, sched_list)
 			kppg->pri_dynamic--;
 	mutex_unlock(&sc_list->lock);
 }
@@ -324,7 +324,7 @@ static bool ipu_psys_scheduler_ppg_enqueue_bufset(struct ipu_psys *psys)
 static bool ipu_psys_scheduler_ppg_halt(struct ipu_psys *psys)
 {
 	struct ipu_psys_scheduler *sched;
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 	struct ipu_psys_fh *fh;
 	bool stopping_exit = false;
 
@@ -336,7 +336,7 @@ static bool ipu_psys_scheduler_ppg_halt(struct ipu_psys *psys)
 			continue;
 		}
 
-		list_for_each_entry(kppg, &sched->ppgs, list) {
+		list_for_each_entry_safe(kppg, tmp, &sched->ppgs, list) {
 			mutex_lock(&kppg->mutex);
 			if (kppg->state & PPG_STATE_STOP) {
 				ipu_psys_ppg_stop(kppg);
@@ -407,7 +407,7 @@ static void ipu_psys_scheduler_kcmd_set(struct ipu_psys *psys)
 {
 	struct ipu_psys_kcmd *kcmd;
 	struct ipu_psys_scheduler *sched;
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 	struct ipu_psys_fh *fh;
 
 	list_for_each_entry(fh, &psys->fhs, list) {
@@ -418,7 +418,7 @@ static void ipu_psys_scheduler_kcmd_set(struct ipu_psys *psys)
 			continue;
 		}
 
-		list_for_each_entry(kppg, &sched->ppgs, list) {
+		list_for_each_entry_safe(kppg, tmp, &sched->ppgs, list) {
 			mutex_lock(&kppg->mutex);
 			if (list_empty(&kppg->kcmds_new_list)) {
 				mutex_unlock(&kppg->mutex);
@@ -437,7 +437,7 @@ static void ipu_psys_scheduler_kcmd_set(struct ipu_psys *psys)
 static bool is_ready_to_enter_power_gating(struct ipu_psys *psys)
 {
 	struct ipu_psys_scheduler *sched;
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 	struct ipu_psys_fh *fh;
 
 	list_for_each_entry(fh, &psys->fhs, list) {
@@ -448,7 +448,7 @@ static bool is_ready_to_enter_power_gating(struct ipu_psys *psys)
 			continue;
 		}
 
-		list_for_each_entry(kppg, &sched->ppgs, list) {
+		list_for_each_entry_safe(kppg, tmp, &sched->ppgs, list) {
 			mutex_lock(&kppg->mutex);
 			if (!list_empty(&kppg->kcmds_new_list) ||
 			    !list_empty(&kppg->kcmds_processing_list)) {
@@ -474,7 +474,7 @@ static bool is_ready_to_enter_power_gating(struct ipu_psys *psys)
 static bool has_pending_kcmd(struct ipu_psys *psys)
 {
 	struct ipu_psys_scheduler *sched;
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 	struct ipu_psys_fh *fh;
 
 	list_for_each_entry(fh, &psys->fhs, list) {
@@ -485,7 +485,7 @@ static bool has_pending_kcmd(struct ipu_psys *psys)
 			continue;
 		}
 
-		list_for_each_entry(kppg, &sched->ppgs, list) {
+		list_for_each_entry_safe(kppg, tmp, &sched->ppgs, list) {
 			mutex_lock(&kppg->mutex);
 			if (!list_empty(&kppg->kcmds_new_list) ||
 			    !list_empty(&kppg->kcmds_processing_list)) {
@@ -515,7 +515,7 @@ static bool ipu_psys_scheduler_exit_power_gating(struct ipu_psys *psys)
 static bool ipu_psys_scheduler_enter_power_gating(struct ipu_psys *psys)
 {
 	struct ipu_psys_scheduler *sched;
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 	struct ipu_psys_fh *fh;
 
 	if (!enable_power_gating)
@@ -540,7 +540,7 @@ static bool ipu_psys_scheduler_enter_power_gating(struct ipu_psys *psys)
 			continue;
 		}
 
-		list_for_each_entry(kppg, &sched->ppgs, list) {
+		list_for_each_entry_safe(kppg, tmp, &sched->ppgs, list) {
 			mutex_lock(&kppg->mutex);
 			if (kppg->state == PPG_STATE_RUNNING) {
 				kppg->state = PPG_STATE_SUSPEND;
diff --git a/drivers/media/pci/intel/ipu6/ipu6-ppg.c b/drivers/media/pci/intel/ipu6/ipu6-ppg.c
index 22b602306b4a..a6860df5db18 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-ppg.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-ppg.c
@@ -121,12 +121,9 @@ int ipu_psys_ppg_get_bufset(struct ipu_psys_kcmd *kcmd,
 {
 	struct ipu_psys *psys = kppg->fh->psys;
 	struct ipu_psys_buffer_set *kbuf_set;
-	size_t buf_set_size;
 	unsigned int i;
 	int ret;
 
-	buf_set_size = ipu_fw_psys_ppg_get_buffer_set_size(kcmd);
-
 	kbuf_set = ipu_psys_create_buffer_set(kcmd, kppg);
 	if (!kbuf_set) {
 		ret = -EINVAL;
@@ -171,7 +168,6 @@ void ipu_psys_ppg_complete(struct ipu_psys *psys, struct ipu_psys_ppg *kppg)
 	mutex_lock(&kppg->mutex);
 	old_ppg_state = kppg->state;
 	if (kppg->state == PPG_STATE_STOPPING) {
-		unsigned long flags;
 		struct ipu_psys_kcmd tmp_kcmd = {
 			.kpg = kppg->kpg,
 		};
@@ -182,9 +178,6 @@ void ipu_psys_ppg_complete(struct ipu_psys *psys, struct ipu_psys_ppg *kppg)
 		queue_id = ipu_fw_psys_ppg_get_base_queue_id(&tmp_kcmd);
 		ipu_psys_free_cmd_queue_resource(&psys->resource_pool_running,
 						 queue_id);
-		spin_lock_irqsave(&psys->pgs_lock, flags);
-		kppg->kpg->pg_size = 0;
-		spin_unlock_irqrestore(&psys->pgs_lock, flags);
 		pm_runtime_put(&psys->adev->dev);
 	} else {
 		if (kppg->state == PPG_STATE_SUSPENDING) {
@@ -391,21 +384,18 @@ int ipu_psys_ppg_stop(struct ipu_psys_ppg *kppg)
 				dev_err(&psys->adev->dev,
 					"ppg(%d) failed to resume\n", ppg_id);
 		} else if (kcmd != &kcmd_temp) {
-			unsigned long flags;
-
 			ipu_psys_free_cmd_queue_resource(
 				&psys->resource_pool_running,
 				ipu_fw_psys_ppg_get_base_queue_id(kcmd));
 			ipu_psys_kcmd_complete(kppg, kcmd, 0);
-			spin_lock_irqsave(&psys->pgs_lock, flags);
-			kppg->kpg->pg_size = 0;
-			spin_unlock_irqrestore(&psys->pgs_lock, flags);
 			dev_dbg(&psys->adev->dev,
 				"s_change:%s %p %d -> %d\n", __func__,
 				kppg, kppg->state, PPG_STATE_STOPPED);
 			pm_runtime_put(&psys->adev->dev);
 			kppg->state = PPG_STATE_STOPPED;
 			return 0;
+		} else {
+			return 0;
 		}
 	}
 	dev_dbg(&psys->adev->dev, "s_change:%s %p %d -> %d\n",
@@ -499,7 +489,7 @@ bool ipu_psys_ppg_enqueue_bufsets(struct ipu_psys_ppg *kppg)
 void ipu_psys_enter_power_gating(struct ipu_psys *psys)
 {
 	struct ipu_psys_scheduler *sched;
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 	struct ipu_psys_fh *fh;
 	int ret = 0;
 
@@ -511,7 +501,7 @@ void ipu_psys_enter_power_gating(struct ipu_psys *psys)
 			continue;
 		}
 
-		list_for_each_entry(kppg, &sched->ppgs, list) {
+		list_for_each_entry_safe(kppg, tmp, &sched->ppgs, list) {
 			mutex_lock(&kppg->mutex);
 			/* kppg has already power down */
 			if (kppg->state == PPG_STATE_STOPPED) {
@@ -535,7 +525,7 @@ void ipu_psys_enter_power_gating(struct ipu_psys *psys)
 void ipu_psys_exit_power_gating(struct ipu_psys *psys)
 {
 	struct ipu_psys_scheduler *sched;
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 	struct ipu_psys_fh *fh;
 	int ret = 0;
 
@@ -547,7 +537,7 @@ void ipu_psys_exit_power_gating(struct ipu_psys *psys)
 			continue;
 		}
 
-		list_for_each_entry(kppg, &sched->ppgs, list) {
+		list_for_each_entry_safe(kppg, tmp, &sched->ppgs, list) {
 			mutex_lock(&kppg->mutex);
 			/* kppg is not started and power up */
 			if (kppg->state == PPG_STATE_START ||
diff --git a/drivers/media/pci/intel/ipu6/ipu6-psys-gpc.c b/drivers/media/pci/intel/ipu6/ipu6-psys-gpc.c
index 4d8ef61d8449..3bf35d245a4f 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-psys-gpc.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-psys-gpc.c
@@ -185,20 +185,14 @@ int ipu_psys_gpc_init_debugfs(struct ipu_psys *psys)
 		if (IS_ERR(file))
 			goto err;
 
-		file = debugfs_create_u32("source", 0600, dir,
-					  &psys_gpcs->gpc[idx].source);
-		if (IS_ERR(file))
-			goto err;
+		debugfs_create_u32("source", 0600, dir,
+				   &psys_gpcs->gpc[idx].source);
 
-		file = debugfs_create_u32("route", 0600, dir,
-					  &psys_gpcs->gpc[idx].route);
-		if (IS_ERR(file))
-			goto err;
+		debugfs_create_u32("route", 0600, dir,
+				   &psys_gpcs->gpc[idx].route);
 
-		file = debugfs_create_u32("sense", 0600, dir,
-					  &psys_gpcs->gpc[idx].sense);
-		if (IS_ERR(file))
-			goto err;
+		debugfs_create_u32("sense", 0600, dir,
+				   &psys_gpcs->gpc[idx].sense);
 
 		psys_gpcs->gpc[idx].gpcindex = idx;
 		psys_gpcs->gpc[idx].prit = psys;
diff --git a/drivers/media/pci/intel/ipu6/ipu6-psys.c b/drivers/media/pci/intel/ipu6/ipu6-psys.c
index 10c6366c60c9..06560b91948b 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-psys.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-psys.c
@@ -161,13 +161,13 @@ void ipu_psys_setup_hw(struct ipu_psys *psys)
 static struct ipu_psys_ppg *ipu_psys_identify_kppg(struct ipu_psys_kcmd *kcmd)
 {
 	struct ipu_psys_scheduler *sched = &kcmd->fh->sched;
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 
 	mutex_lock(&kcmd->fh->mutex);
 	if (list_empty(&sched->ppgs))
 		goto not_found;
 
-	list_for_each_entry(kppg, &sched->ppgs, list) {
+	list_for_each_entry_safe(kppg, tmp, &sched->ppgs, list) {
 		if (ipu_fw_psys_pg_get_token(kcmd)
 		    != kppg->token)
 			continue;
@@ -184,7 +184,7 @@ static struct ipu_psys_ppg *ipu_psys_identify_kppg(struct ipu_psys_kcmd *kcmd)
  * Called to free up all resources associated with a kcmd.
  * After this the kcmd doesn't anymore exist in the driver.
  */
-void ipu_psys_kcmd_free(struct ipu_psys_kcmd *kcmd)
+static void ipu_psys_kcmd_free(struct ipu_psys_kcmd *kcmd)
 {
 	struct ipu_psys_ppg *kppg;
 	struct ipu_psys_scheduler *sched;
@@ -421,7 +421,7 @@ static struct ipu_psys_ppg *ipu_psys_lookup_ppg(struct ipu_psys *psys,
 						dma_addr_t pg_addr)
 {
 	struct ipu_psys_scheduler *sched;
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 	struct ipu_psys_fh *fh;
 
 	list_for_each_entry(fh, &psys->fhs, list) {
@@ -432,7 +432,7 @@ static struct ipu_psys_ppg *ipu_psys_lookup_ppg(struct ipu_psys *psys,
 			continue;
 		}
 
-		list_for_each_entry(kppg, &sched->ppgs, list) {
+		list_for_each_entry_safe(kppg, tmp, &sched->ppgs, list) {
 			if (pg_addr != kppg->kpg->pg_dma_addr)
 				continue;
 			mutex_unlock(&fh->mutex);
@@ -654,9 +654,6 @@ static int ipu_psys_kcmd_send_to_ppg(struct ipu_psys_kcmd *kcmd)
 			id = ipu_fw_psys_ppg_get_base_queue_id(kcmd);
 			ipu_psys_free_cmd_queue_resource(rpr, id);
 			ipu_psys_kcmd_complete(kppg, kcmd, 0);
-			spin_lock_irqsave(&psys->pgs_lock, flags);
-			kppg->kpg->pg_size = 0;
-			spin_unlock_irqrestore(&psys->pgs_lock, flags);
 			pm_runtime_put(&psys->adev->dev);
 			resche = false;
 		} else {
@@ -740,7 +737,7 @@ static bool ipu_psys_kcmd_is_valid(struct ipu_psys *psys,
 {
 	struct ipu_psys_fh *fh;
 	struct ipu_psys_kcmd *kcmd0;
-	struct ipu_psys_ppg *kppg;
+	struct ipu_psys_ppg *kppg, *tmp;
 	struct ipu_psys_scheduler *sched;
 
 	list_for_each_entry(fh, &psys->fhs, list) {
@@ -750,7 +747,7 @@ static bool ipu_psys_kcmd_is_valid(struct ipu_psys *psys,
 			mutex_unlock(&fh->mutex);
 			continue;
 		}
-		list_for_each_entry(kppg, &sched->ppgs, list) {
+		list_for_each_entry_safe(kppg, tmp, &sched->ppgs, list) {
 			mutex_lock(&kppg->mutex);
 			list_for_each_entry(kcmd0,
 					    &kppg->kcmds_processing_list,
@@ -920,12 +917,12 @@ int ipu_psys_fh_deinit(struct ipu_psys_fh *fh)
 	mutex_lock(&fh->mutex);
 	if (!list_empty(&sched->ppgs)) {
 		list_for_each_entry_safe(kppg, kppg0, &sched->ppgs, list) {
-			mutex_unlock(&fh->mutex);
+			unsigned long flags;
+
 			mutex_lock(&kppg->mutex);
 			if (!(kppg->state &
 			      (PPG_STATE_STOPPED |
 			       PPG_STATE_STOPPING))) {
-				unsigned long flags;
 				struct ipu_psys_kcmd tmp = {
 					.kpg = kppg->kpg,
 				};
@@ -940,42 +937,45 @@ int ipu_psys_fh_deinit(struct ipu_psys_fh *fh)
 				    "s_change:%s %p %d -> %d\n", __func__,
 				    kppg, kppg->state, PPG_STATE_STOPPED);
 				kppg->state = PPG_STATE_STOPPED;
-				spin_lock_irqsave(&psys->pgs_lock, flags);
-				kppg->kpg->pg_size = 0;
-				spin_unlock_irqrestore(&psys->pgs_lock, flags);
 				if (psys->power_gating != PSYS_POWER_GATED)
 					pm_runtime_put(&psys->adev->dev);
 			}
+			list_del(&kppg->list);
 			mutex_unlock(&kppg->mutex);
 
 			list_for_each_entry_safe(kcmd, kcmd0,
 						 &kppg->kcmds_new_list, list) {
 				kcmd->pg_user = NULL;
+				mutex_unlock(&fh->mutex);
 				ipu_psys_kcmd_free(kcmd);
+				mutex_lock(&fh->mutex);
 			}
 
 			list_for_each_entry_safe(kcmd, kcmd0,
 						 &kppg->kcmds_processing_list,
 						 list) {
 				kcmd->pg_user = NULL;
+				mutex_unlock(&fh->mutex);
 				ipu_psys_kcmd_free(kcmd);
+				mutex_lock(&fh->mutex);
 			}
 
 			list_for_each_entry_safe(kcmd, kcmd0,
 						 &kppg->kcmds_finished_list,
 						 list) {
 				kcmd->pg_user = NULL;
+				mutex_unlock(&fh->mutex);
 				ipu_psys_kcmd_free(kcmd);
+				mutex_lock(&fh->mutex);
 			}
 
-			mutex_lock(&kppg->mutex);
-			list_del(&kppg->list);
-			mutex_unlock(&kppg->mutex);
+			spin_lock_irqsave(&psys->pgs_lock, flags);
+			kppg->kpg->pg_size = 0;
+			spin_unlock_irqrestore(&psys->pgs_lock, flags);
 
 			mutex_destroy(&kppg->mutex);
 			kfree(kppg->manifest);
 			kfree(kppg);
-			mutex_lock(&fh->mutex);
 		}
 	}
 	mutex_unlock(&fh->mutex);
diff --git a/drivers/media/pci/intel/ipu6/ipu6.c b/drivers/media/pci/intel/ipu6/ipu6.c
index a404c2f301d0..da33bc952624 100644
--- a/drivers/media/pci/intel/ipu6/ipu6.c
+++ b/drivers/media/pci/intel/ipu6/ipu6.c
@@ -341,29 +341,6 @@ int ipu_buttress_psys_freq_get(void *data, u64 *val)
 	return 0;
 }
 
-int ipu_buttress_isys_freq_get(void *data, u64 *val)
-{
-	struct ipu_device *isp = data;
-	u32 reg_val;
-	int rval;
-
-	rval = pm_runtime_get_sync(&isp->isys->dev);
-	if (rval < 0) {
-		pm_runtime_put(&isp->isys->dev);
-		dev_err(&isp->pdev->dev, "Runtime PM failed (%d)\n", rval);
-		return rval;
-	}
-
-	reg_val = readl(isp->base + BUTTRESS_REG_IS_FREQ_CTL);
-
-	pm_runtime_put(&isp->isys->dev);
-
-	*val = IPU_IS_FREQ_RATIO_BASE *
-	    (reg_val & IPU_BUTTRESS_IS_FREQ_CTL_DIVISOR_MASK);
-
-	return 0;
-}
-
 void ipu_internal_pdata_init(void)
 {
 	if (ipu_ver == IPU_VER_6) {
diff --git a/drivers/media/pci/intel/ipu6/ipu6se-fw-resources.c b/drivers/media/pci/intel/ipu6/ipu6se-fw-resources.c
index e94519a34f6b..c0413fbddef6 100644
--- a/drivers/media/pci/intel/ipu6/ipu6se-fw-resources.c
+++ b/drivers/media/pci/intel/ipu6/ipu6se-fw-resources.c
@@ -317,7 +317,6 @@ void ipu6se_fw_psys_pg_dump(struct ipu_psys *psys,
 	u8 processes = pg->process_count;
 	u16 *process_offset_table = (u16 *)((char *)pg + pg->processes_offset);
 	unsigned int p, chn, mem, mem_id;
-	int cell;
 
 	dev_dbg(&psys->adev->dev, "%s %s pgid %i has %i processes:\n",
 		__func__, note, pgid, processes);
@@ -329,7 +328,6 @@ void ipu6se_fw_psys_pg_dump(struct ipu_psys *psys,
 		struct ipu6se_fw_psys_process_ext *pm_ext =
 		    (struct ipu6se_fw_psys_process_ext *)((u8 *)process
 		    + process->process_extension_offset);
-		cell = process->cells[0];
 		dev_dbg(&psys->adev->dev, "\t process %i size=%u",
 			p, process->size);
 		if (!process->process_extension_offset)
diff --git a/include/uapi/linux/ipu-isys.h b/include/uapi/linux/ipu-isys.h
index a0e657704087..4aabb14328a5 100644
--- a/include/uapi/linux/ipu-isys.h
+++ b/include/uapi/linux/ipu-isys.h
@@ -7,6 +7,7 @@
 #define V4L2_CID_IPU_BASE	(V4L2_CID_USER_BASE + 0x1080)
 
 #define V4L2_CID_IPU_STORE_CSI2_HEADER	(V4L2_CID_IPU_BASE + 2)
+#define V4L2_CID_IPU_ISYS_COMPRESSION	(V4L2_CID_IPU_BASE + 3)
 
 #define VIDIOC_IPU_GET_DRIVER_VERSION \
 	_IOWR('v', BASE_VIDIOC_PRIVATE + 3, uint32_t)
-- 
2.33.1




More information about the kernel-team mailing list