commit 52952f809ac1f7b8ef60716856db4df74593adc1
Author: Kate Hsuan <hpa(a)redhat.com>
Date: Wed May 3 14:42:16 2023 +0800
Initial package
- Fix typo
.gitignore | 2 +
0001-Fix-dmabuf-errors-with-kernel-6.2.patch | 80 ++++++++++
...sys-Fix-possible-deadlock-with-kernel-6.2.patch | 169 +++++++++++++++++++++
...Use-clk-framework-instead-of-a-clken-GPIO.patch | 137 +++++++++++++++++
...e-powerdown-and-reset-signals-active-low-.patch | 128 ++++++++++++++++
0005-sensors-Make-pled-GPIO-optional.patch | 75 +++++++++
0006-ov01a1s-Drop-unused-link_freq-variable.patch | 34 +++++
...-rename-the-already-registered-PCI-device.patch | 39 +++++
intel-ipu6-kmod.spec | 121 +++++++++++++++
sources | 2 +
10 files changed, 787 insertions(+)
---
diff --git a/.gitignore b/.gitignore
index e69de29..6a53ae1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/ipu6-drivers-f83b074.tar.gz
+/ivsc-driver-94ecb88.tar.gz
diff --git a/0001-Fix-dmabuf-errors-with-kernel-6.2.patch
b/0001-Fix-dmabuf-errors-with-kernel-6.2.patch
new file mode 100644
index 0000000..e238899
--- /dev/null
+++ b/0001-Fix-dmabuf-errors-with-kernel-6.2.patch
@@ -0,0 +1,80 @@
+From 5b579f5f93a9b4b46eb5c8376f7e1def601eb7cf Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede(a)redhat.com>
+Date: Wed, 11 Jan 2023 15:26:29 +0100
+Subject: [PATCH 1/7] Fix dmabuf errors with kernel 6.2
+
+Linux kernels >= 6.2 need drivers to either explictly take
+the dma-buf-reservation lock themselves; or they need to call
+the _unlocked variant of various dmabuf functions to do this
+for them.
+
+See upstream linux commit ae2e7f28a170c01f ("dma-buf: Document
+dynamic locking convention") for details.
+
+Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
+---
+ drivers/media/pci/intel/ipu-psys.c | 21 ++++++++++++++++++++-
+ 1 file changed, 20 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/media/pci/intel/ipu-psys.c b/drivers/media/pci/intel/ipu-psys.c
+index 9731ff5a9..676fce09c 100644
+--- a/drivers/media/pci/intel/ipu-psys.c
++++ b/drivers/media/pci/intel/ipu-psys.c
+@@ -622,7 +622,11 @@ static inline void ipu_psys_kbuf_unmap(struct ipu_psys_kbuffer
*kbuf)
+ struct iosys_map dmap;
+
+ iosys_map_set_vaddr(&dmap, kbuf->kaddr);
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0)
++ dma_buf_vunmap_unlocked(kbuf->dbuf, &dmap);
++#else
+ dma_buf_vunmap(kbuf->dbuf, &dmap);
++#endif
+ }
+ #elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) && LINUX_VERSION_CODE !=
KERNEL_VERSION(5, 10, 46)
+ if (kbuf->kaddr) {
+@@ -635,10 +639,17 @@ static inline void ipu_psys_kbuf_unmap(struct ipu_psys_kbuffer
*kbuf)
+ if (kbuf->kaddr)
+ dma_buf_vunmap(kbuf->dbuf, kbuf->kaddr);
+ #endif
+- if (kbuf->sgt)
++ if (kbuf->sgt) {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0)
++ dma_buf_unmap_attachment_unlocked(kbuf->db_attach,
++ kbuf->sgt,
++ DMA_BIDIRECTIONAL);
++#else
+ dma_buf_unmap_attachment(kbuf->db_attach,
+ kbuf->sgt,
+ DMA_BIDIRECTIONAL);
++#endif
++ }
+ if (kbuf->db_attach)
+ dma_buf_detach(kbuf->dbuf, kbuf->db_attach);
+ dma_buf_put(kbuf->dbuf);
+@@ -828,7 +839,11 @@ int ipu_psys_mapbuf_locked(int fd, struct ipu_psys_fh *fh,
+ goto kbuf_map_fail;
+ }
+
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0)
++ kbuf->sgt = dma_buf_map_attachment_unlocked(kbuf->db_attach, DMA_BIDIRECTIONAL);
++#else
+ kbuf->sgt = dma_buf_map_attachment(kbuf->db_attach, DMA_BIDIRECTIONAL);
++#endif
+ if (IS_ERR_OR_NULL(kbuf->sgt)) {
+ ret = -EINVAL;
+ kbuf->sgt = NULL;
+@@ -839,7 +854,11 @@ int ipu_psys_mapbuf_locked(int fd, struct ipu_psys_fh *fh,
+ kbuf->dma_addr = sg_dma_address(kbuf->sgt->sgl);
+
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) && LINUX_VERSION_CODE !=
KERNEL_VERSION(5, 10, 46)
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0)
++ ret = dma_buf_vmap_unlocked(kbuf->dbuf, &dmap);
++#else
+ ret = dma_buf_vmap(kbuf->dbuf, &dmap);
++#endif
+ if (ret) {
+ dev_dbg(&psys->adev->dev, "dma buf vmap failed\n");
+ goto kbuf_map_fail;
+--
+2.39.1
+
diff --git a/0002-ipu6-psys-Fix-possible-deadlock-with-kernel-6.2.patch
b/0002-ipu6-psys-Fix-possible-deadlock-with-kernel-6.2.patch
new file mode 100644
index 0000000..32489ec
--- /dev/null
+++ b/0002-ipu6-psys-Fix-possible-deadlock-with-kernel-6.2.patch
@@ -0,0 +1,169 @@
+From e12937494f09a1e21f2ad2ba71579bd0480d13fc Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede(a)redhat.com>
+Date: Fri, 27 Jan 2023 12:04:00 +0100
+Subject: [PATCH 2/7] ipu6-psys: Fix possible deadlock with kernel 6.2
+
+With kernel 6.2 the following possible deadlock gets reported:
+
+[ 765.679269] ======================================================
+[ 765.679270] WARNING: possible circular locking dependency detected
+[ 765.679271] 6.2.0-rc5+ #40 Tainted: G O
+[ 765.679272] ------------------------------------------------------
+[ 765.679272] camerasrc0:src/6354 is trying to acquire lock:
+[ 765.679273] ffff992aa6ad8158 (&mm->mmap_lock){++++}-{3:3}, at:
ipu_dma_buf_map+0x16c/0x400 [intel_ipu6_psys]
+[ 765.679281]
+ but task is already holding lock:
+[ 765.679282] ffff992aa6059dc8 (reservation_ww_class_mutex){+.+.}-{3:3}, at:
dma_buf_map_attachment_unlocked+0x3d/0x90
+[ 765.679286]
+ which lock already depends on the new lock.
+
+[ 765.679287]
+ the existing dependency chain (in reverse order) is:
+[ 765.679287]
+ -> #1 (reservation_ww_class_mutex){+.+.}-{3:3}:
+[ 765.679289] __ww_mutex_lock.constprop.0+0xbc/0xfb0
+[ 765.679292] ww_mutex_lock_interruptible+0x38/0xa0
+[ 765.679293] vm_fault_cpu+0x32/0x1a0 [i915]
+[ 765.679396] __do_fault+0x30/0x160
+[ 765.679399] do_fault+0x2bf/0x440
+[ 765.679400] __handle_mm_fault+0x671/0xfb0
+[ 765.679401] handle_mm_fault+0x16b/0x410
+[ 765.679403] do_user_addr_fault+0x1e0/0x6b0
+[ 765.679406] exc_page_fault+0x7e/0x2b0
+[ 765.679408] asm_exc_page_fault+0x22/0x30
+[ 765.679411]
+ -> #0 (&mm->mmap_lock){++++}-{3:3}:
+[ 765.679412] __lock_acquire+0x12fd/0x1fd0
+[ 765.679415] lock_acquire+0xbf/0x2b0
+[ 765.679416] down_read+0x3e/0x50
+[ 765.679418] ipu_dma_buf_map+0x16c/0x400 [intel_ipu6_psys]
+[ 765.679423] __map_dma_buf+0x1e/0x90
+[ 765.679424] dma_buf_map_attachment+0xc3/0x120
+[ 765.679426] dma_buf_map_attachment_unlocked+0x47/0x90
+[ 765.679427] ipu_psys_mapbuf_locked+0x116/0x430 [intel_ipu6_psys]
+[ 765.679431] ipu_psys_ioctl+0x1b1/0x4f0 [intel_ipu6_psys]
+[ 765.679435] __x64_sys_ioctl+0x8d/0xd0
+[ 765.679436] do_syscall_64+0x58/0x80
+[ 765.679438] entry_SYSCALL_64_after_hwframe+0x72/0xdc
+[ 765.679440]
+ other info that might help us debug this:
+
+[ 765.679441] Possible unsafe locking scenario:
+
+[ 765.679441] CPU0 CPU1
+[ 765.679442] ---- ----
+[ 765.679442] lock(reservation_ww_class_mutex);
+[ 765.679443] lock(&mm->mmap_lock);
+[ 765.679444] lock(reservation_ww_class_mutex);
+[ 765.679445] lock(&mm->mmap_lock);
+[ 765.679446]
+ *** DEADLOCK ***
+
+This is caused by ipu_psys_mapbuf_locked() calling
+dma_buf_map_attachment_unlocked() which takes reservation_ww_class_mutex
+and then calls back into ipu_dma_buf_map() which calls
+ipu_psys_get_userpages() which takes mm->mmap_lock.
+
+So the IPU6 code takes locks in the following order:
+
+1. lock(reservation_ww_class_mutex)
+2. lock(&mm->mmap_lock)
+
+But the core memory-management code takes these in the reverse
+oder causing an ABBA deadlock.
+
+Fix this by moving the ipu_psys_get_userpages() call to attach time (to
+ipu_dma_buf_attach()) like how other dmabuf code in the kernel does this.
+
+As a bonus this also allows properly propagating the error code from
+ipu_psys_get_userpages().
+
+Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
+---
+ drivers/media/pci/intel/ipu-psys.c | 18 ++++++++----------
+ 1 file changed, 8 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/media/pci/intel/ipu-psys.c b/drivers/media/pci/intel/ipu-psys.c
+index 676fce09c..4f93ba82d 100644
+--- a/drivers/media/pci/intel/ipu-psys.c
++++ b/drivers/media/pci/intel/ipu-psys.c
+@@ -296,6 +296,7 @@ static int ipu_dma_buf_attach(struct dma_buf *dbuf, struct device
*dev,
+ {
+ struct ipu_psys_kbuffer *kbuf = dbuf->priv;
+ struct ipu_dma_buf_attach *ipu_attach;
++ int ret;
+
+ ipu_attach = kzalloc(sizeof(*ipu_attach), GFP_KERNEL);
+ if (!ipu_attach)
+@@ -307,6 +308,12 @@ static int ipu_dma_buf_attach(struct dma_buf *dbuf, struct device
*dev,
+ ipu_attach->len = kbuf->len;
+ ipu_attach->userptr = kbuf->userptr;
+
++ ret = ipu_psys_get_userpages(ipu_attach);
++ if (ret) {
++ kfree(ipu_attach);
++ return ret;
++ }
++
+ attach->priv = ipu_attach;
+ return 0;
+ }
+@@ -316,6 +323,7 @@ static void ipu_dma_buf_detach(struct dma_buf *dbuf,
+ {
+ struct ipu_dma_buf_attach *ipu_attach = attach->priv;
+
++ ipu_psys_put_userpages(ipu_attach);
+ kfree(ipu_attach);
+ attach->priv = NULL;
+ }
+@@ -331,16 +339,11 @@ static struct sg_table *ipu_dma_buf_map(struct dma_buf_attachment
*attach,
+ #endif
+ int ret;
+
+- ret = ipu_psys_get_userpages(ipu_attach);
+- if (ret)
+- return NULL;
+-
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0)
+ dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
+ ret = dma_map_sg_attrs(attach->dev, ipu_attach->sgt->sgl,
+ ipu_attach->sgt->orig_nents, dir, &attrs);
+ if (!ret) {
+- ipu_psys_put_userpages(ipu_attach);
+ dev_dbg(attach->dev, "buf map failed\n");
+
+ return ERR_PTR(-EIO);
+@@ -351,7 +354,6 @@ static struct sg_table *ipu_dma_buf_map(struct dma_buf_attachment
*attach,
+ ret = dma_map_sg_attrs(attach->dev, ipu_attach->sgt->sgl,
+ ipu_attach->sgt->orig_nents, dir, attrs);
+ if (!ret) {
+- ipu_psys_put_userpages(ipu_attach);
+ dev_dbg(attach->dev, "buf map failed\n");
+
+ return ERR_PTR(-EIO);
+@@ -361,7 +363,6 @@ static struct sg_table *ipu_dma_buf_map(struct dma_buf_attachment
*attach,
+ attrs = DMA_ATTR_SKIP_CPU_SYNC;
+ ret = dma_map_sgtable(attach->dev, ipu_attach->sgt, dir, attrs);
+ if (ret < 0) {
+- ipu_psys_put_userpages(ipu_attach);
+ dev_dbg(attach->dev, "buf map failed\n");
+
+ return ERR_PTR(-EIO);
+@@ -381,14 +382,11 @@ static struct sg_table *ipu_dma_buf_map(struct dma_buf_attachment
*attach,
+ static void ipu_dma_buf_unmap(struct dma_buf_attachment *attach,
+ struct sg_table *sgt, enum dma_data_direction dir)
+ {
+- struct ipu_dma_buf_attach *ipu_attach = attach->priv;
+-
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0)
+ dma_unmap_sg(attach->dev, sgt->sgl, sgt->orig_nents, dir);
+ #else
+ dma_unmap_sgtable(attach->dev, sgt, dir, DMA_ATTR_SKIP_CPU_SYNC);
+ #endif
+- ipu_psys_put_userpages(ipu_attach);
+ }
+
+ static int ipu_dma_buf_mmap(struct dma_buf *dbuf, struct vm_area_struct *vma)
+--
+2.39.1
+
diff --git a/0003-sensors-Use-clk-framework-instead-of-a-clken-GPIO.patch
b/0003-sensors-Use-clk-framework-instead-of-a-clken-GPIO.patch
new file mode 100644
index 0000000..3934643
--- /dev/null
+++ b/0003-sensors-Use-clk-framework-instead-of-a-clken-GPIO.patch
@@ -0,0 +1,137 @@
+From a5860d0afb5a35040beafb69445282d97e27ed0a Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede(a)redhat.com>
+Date: Tue, 29 Nov 2022 15:06:23 +0100
+Subject: [PATCH 3/7] sensors: Use clk-framework instead of a "clken" GPIO
+
+Use the clk-framework to get a clk-provider reference and use
+clk_prepare_enable() / clk_disable_unprepare() to control the clk.
+
+This replace modelling the clock as a "clken" GPIO, which is not a valid
+way to model it when the clk is e.g. generated by the clk-generator of
+a TPS68470 PMIC.
+
+This relies on the following upstream bugfix for the INT3472 clk provider:
+
+https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cf5ac2d45f6e4d11ad78e7b10ae9a4121ba5e995
+
+"platform/x86: int3472/discrete: Ensure the clk/power enable pins are in output
mode"
+
+This patch is available since upstream kernel 6.1.7, so the new
+code is only enabled for LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 7)
+
+This allow susing the IPU6 sensor drivers with the upstream int3472
+driver with unmodified upstream kernels >= 6.1.7 .
+
+Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
+---
+ drivers/media/i2c/hm11b1.c | 18 ++++++++++++++++++
+ drivers/media/i2c/ov01a1s.c | 18 ++++++++++++++++++
+ 2 files changed, 36 insertions(+)
+
+diff --git a/drivers/media/i2c/hm11b1.c b/drivers/media/i2c/hm11b1.c
+index 1cc5cd761..e14810bdd 100644
+--- a/drivers/media/i2c/hm11b1.c
++++ b/drivers/media/i2c/hm11b1.c
+@@ -468,8 +468,13 @@ struct hm11b1 {
+ struct gpio_desc *reset_gpio;
+ /* GPIO for powerdown */
+ struct gpio_desc *powerdown_gpio;
++#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 7)
+ /* GPIO for clock enable */
+ struct gpio_desc *clken_gpio;
++#else
++ /* Clock provider */
++ struct clk *clk;
++#endif
+ /* GPIO for privacy LED */
+ struct gpio_desc *pled_gpio;
+ #endif
+@@ -508,7 +513,14 @@ static void hm11b1_set_power(struct hm11b1 *hm11b1, int on)
+ return;
+ gpiod_set_value_cansleep(hm11b1->reset_gpio, on);
+ gpiod_set_value_cansleep(hm11b1->powerdown_gpio, on);
++#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 7)
+ gpiod_set_value_cansleep(hm11b1->clken_gpio, on);
++#else
++ if (on)
++ clk_prepare_enable(hm11b1->clk);
++ else
++ clk_disable_unprepare(hm11b1->clk);
++#endif
+ gpiod_set_value_cansleep(hm11b1->pled_gpio, on);
+ msleep(20);
+ #elif IS_ENABLED(CONFIG_POWER_CTRL_LOGIC)
+@@ -1093,12 +1105,18 @@ static int hm11b1_parse_dt(struct hm11b1 *hm11b1)
+ return ret;
+ }
+
++#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 7)
+ hm11b1->clken_gpio = devm_gpiod_get(dev, "clken", GPIOD_OUT_HIGH);
+ ret = PTR_ERR_OR_ZERO(hm11b1->clken_gpio);
+ if (ret < 0) {
+ dev_err(dev, "error while getting clken_gpio gpio: %d\n", ret);
+ return ret;
+ }
++#else
++ hm11b1->clk = devm_clk_get_optional(dev, "clk");
++ if (IS_ERR(hm11b1->clk))
++ return dev_err_probe(dev, PTR_ERR(hm11b1->clk), "getting clk\n");
++#endif
+
+ hm11b1->pled_gpio = devm_gpiod_get(dev, "pled", GPIOD_OUT_HIGH);
+ ret = PTR_ERR_OR_ZERO(hm11b1->pled_gpio);
+diff --git a/drivers/media/i2c/ov01a1s.c b/drivers/media/i2c/ov01a1s.c
+index e4477625c..628a1dd83 100644
+--- a/drivers/media/i2c/ov01a1s.c
++++ b/drivers/media/i2c/ov01a1s.c
+@@ -317,8 +317,13 @@ struct ov01a1s {
+ struct gpio_desc *reset_gpio;
+ /* GPIO for powerdown */
+ struct gpio_desc *powerdown_gpio;
++#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 7)
+ /* GPIO for clock enable */
+ struct gpio_desc *clken_gpio;
++#else
++ /* Clock provider */
++ struct clk *clk;
++#endif
+ /* GPIO for privacy LED */
+ struct gpio_desc *pled_gpio;
+ #endif
+@@ -339,7 +344,14 @@ static void ov01a1s_set_power(struct ov01a1s *ov01a1s, int on)
+ return;
+ gpiod_set_value_cansleep(ov01a1s->reset_gpio, on);
+ gpiod_set_value_cansleep(ov01a1s->powerdown_gpio, on);
++#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 7)
+ gpiod_set_value_cansleep(ov01a1s->clken_gpio, on);
++#else
++ if (on)
++ clk_prepare_enable(ov01a1s->clk);
++ else
++ clk_disable_unprepare(ov01a1s->clk);
++#endif
+ gpiod_set_value_cansleep(ov01a1s->pled_gpio, on);
+ msleep(20);
+ #elif IS_ENABLED(CONFIG_POWER_CTRL_LOGIC)
+@@ -945,12 +957,18 @@ static int ov01a1s_parse_dt(struct ov01a1s *ov01a1s)
+ return -EPROBE_DEFER;
+ }
+
++#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 7)
+ ov01a1s->clken_gpio = devm_gpiod_get(dev, "clken", GPIOD_OUT_HIGH);
+ ret = PTR_ERR_OR_ZERO(ov01a1s->clken_gpio);
+ if (ret < 0) {
+ dev_err(dev, "error while getting clken_gpio gpio: %d\n", ret);
+ return -EPROBE_DEFER;
+ }
++#else
++ ov01a1s->clk = devm_clk_get_optional(dev, "clk");
++ if (IS_ERR(ov01a1s->clk))
++ return dev_err_probe(dev, PTR_ERR(ov01a1s->clk), "getting clk\n");
++#endif
+
+ ov01a1s->pled_gpio = devm_gpiod_get(dev, "pled", GPIOD_OUT_HIGH);
+ ret = PTR_ERR_OR_ZERO(ov01a1s->pled_gpio);
+--
+2.39.1
+
diff --git a/0004-sensors-Make-powerdown-and-reset-signals-active-low-.patch
b/0004-sensors-Make-powerdown-and-reset-signals-active-low-.patch
new file mode 100644
index 0000000..2f925ae
--- /dev/null
+++ b/0004-sensors-Make-powerdown-and-reset-signals-active-low-.patch
@@ -0,0 +1,128 @@
+From 04baabda0d2dfe9be24372c3dd2099a52e15fbed Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede(a)redhat.com>
+Date: Tue, 29 Nov 2022 23:37:50 +0100
+Subject: [PATCH 4/7] sensors: Make powerdown and reset signals active-low by
+ default
+
+The powerdown and reset functions should be set to 0, as in
+not-powered-down, not-in-reset when the sensor is turned on.
+
+Adjust the gpiod_set() value parameters for the powerdown_gpio
+and reset_gpio to !on to properly reflect this.
+
+Typical sensors however have a NRESET aka /RESET pin which needs
+to be driven low to put the device in reset and the have
+a powerup/enable pin rather then a powerdown pin. So at
+the physicical level the pins associated with the reset and
+powerdown functions need to be driven low to put the chip
+in reset / to power the chip down. Mark the pins as active-low
+in the added gpio-lookup table entries for these pin to
+reflect this.
+
+This double negation has 0 net effect, but it uses the GPIO
+subsystem functionality as intended (setting reset to 0
+on poweron makes lot more sense then setting it to 1 on poweron)
+and it aligns the use of these GPIOs with that of the mainline
+kernel allowing future use of the IPU6 driver with the
+mainline INT3472 driver without needing to patch the mainline
+kernel.
+
+Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
+---
+ drivers/media/i2c/hm11b1.c | 4 ++--
+ drivers/media/i2c/ov01a1s.c | 4 ++--
+ drivers/media/i2c/ov2740.c | 2 +-
+ ...nt3472-support-independent-clock-and-LED-gpios-5.17+.patch | 4 ++--
+ patch/int3472-support-independent-clock-and-LED-gpios.patch | 4 ++--
+ 5 files changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/media/i2c/hm11b1.c b/drivers/media/i2c/hm11b1.c
+index e14810bdd..652e8f177 100644
+--- a/drivers/media/i2c/hm11b1.c
++++ b/drivers/media/i2c/hm11b1.c
+@@ -511,8 +511,8 @@ static void hm11b1_set_power(struct hm11b1 *hm11b1, int on)
+ #if IS_ENABLED(CONFIG_INTEL_SKL_INT3472)
+ if (!(hm11b1->reset_gpio && hm11b1->powerdown_gpio))
+ return;
+- gpiod_set_value_cansleep(hm11b1->reset_gpio, on);
+- gpiod_set_value_cansleep(hm11b1->powerdown_gpio, on);
++ gpiod_set_value_cansleep(hm11b1->reset_gpio, !on);
++ gpiod_set_value_cansleep(hm11b1->powerdown_gpio, !on);
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 7)
+ gpiod_set_value_cansleep(hm11b1->clken_gpio, on);
+ #else
+diff --git a/drivers/media/i2c/ov01a1s.c b/drivers/media/i2c/ov01a1s.c
+index 628a1dd83..2ce81d04a 100644
+--- a/drivers/media/i2c/ov01a1s.c
++++ b/drivers/media/i2c/ov01a1s.c
+@@ -342,8 +342,8 @@ static void ov01a1s_set_power(struct ov01a1s *ov01a1s, int on)
+ #if IS_ENABLED(CONFIG_INTEL_SKL_INT3472)
+ if (!(ov01a1s->reset_gpio && ov01a1s->powerdown_gpio))
+ return;
+- gpiod_set_value_cansleep(ov01a1s->reset_gpio, on);
+- gpiod_set_value_cansleep(ov01a1s->powerdown_gpio, on);
++ gpiod_set_value_cansleep(ov01a1s->reset_gpio, !on);
++ gpiod_set_value_cansleep(ov01a1s->powerdown_gpio, !on);
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 7)
+ gpiod_set_value_cansleep(ov01a1s->clken_gpio, on);
+ #else
+diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c
+index 67fb17e08..a8bb10177 100644
+--- a/drivers/media/i2c/ov2740.c
++++ b/drivers/media/i2c/ov2740.c
+@@ -596,7 +596,7 @@ static void ov2740_set_power(struct ov2740 *ov2740, int on)
+ {
+ if (!(ov2740->reset_gpio && ov2740->pled_gpio))
+ return;
+- gpiod_set_value_cansleep(ov2740->reset_gpio, on);
++ gpiod_set_value_cansleep(ov2740->reset_gpio, !on);
+ gpiod_set_value_cansleep(ov2740->pled_gpio, on);
+ msleep(20);
+ }
+diff --git a/patch/int3472-support-independent-clock-and-LED-gpios-5.17+.patch
b/patch/int3472-support-independent-clock-and-LED-gpios-5.17+.patch
+index 57373ac85..66ed770b6 100644
+--- a/patch/int3472-support-independent-clock-and-LED-gpios-5.17+.patch
++++ b/patch/int3472-support-independent-clock-and-LED-gpios-5.17+.patch
+@@ -65,7 +65,7 @@ index ed4c9d760757..f5857ec334fa 100644
+ case INT3472_GPIO_TYPE_RESET:
+ ret = skl_int3472_map_gpio_to_sensor(int3472, agpio, "reset",
+ - GPIO_ACTIVE_LOW);
+-+ polarity);
+++ polarity ^ GPIO_ACTIVE_LOW);
+ if (ret)
+ err_msg = "Failed to map reset pin to sensor\n";
+
+@@ -73,7 +73,7 @@ index ed4c9d760757..f5857ec334fa 100644
+ case INT3472_GPIO_TYPE_POWERDOWN:
+ ret = skl_int3472_map_gpio_to_sensor(int3472, agpio, "powerdown",
+ - GPIO_ACTIVE_LOW);
+-+ polarity);
+++ polarity ^ GPIO_ACTIVE_LOW);
+ if (ret)
+ err_msg = "Failed to map powerdown pin to sensor\n";
+
+diff --git a/patch/int3472-support-independent-clock-and-LED-gpios.patch
b/patch/int3472-support-independent-clock-and-LED-gpios.patch
+index a2def0d76..df70ce4a7 100644
+--- a/patch/int3472-support-independent-clock-and-LED-gpios.patch
++++ b/patch/int3472-support-independent-clock-and-LED-gpios.patch
+@@ -65,7 +65,7 @@ index e59d79c7e82f..5cf6dd63d43f 100644
+ case INT3472_GPIO_TYPE_RESET:
+ ret = skl_int3472_map_gpio_to_sensor(int3472, agpio, "reset",
+ - GPIO_ACTIVE_LOW);
+-+ polarity);
+++ polarity ^ GPIO_ACTIVE_LOW);
+ if (ret)
+ err_msg = "Failed to map reset pin to sensor\n";
+
+@@ -73,7 +73,7 @@ index e59d79c7e82f..5cf6dd63d43f 100644
+ case INT3472_GPIO_TYPE_POWERDOWN:
+ ret = skl_int3472_map_gpio_to_sensor(int3472, agpio, "powerdown",
+ - GPIO_ACTIVE_LOW);
+-+ polarity);
+++ polarity ^ GPIO_ACTIVE_LOW);
+ if (ret)
+ err_msg = "Failed to map powerdown pin to sensor\n";
+
+--
+2.39.1
+
diff --git a/0005-sensors-Make-pled-GPIO-optional.patch
b/0005-sensors-Make-pled-GPIO-optional.patch
new file mode 100644
index 0000000..82cc0a0
--- /dev/null
+++ b/0005-sensors-Make-pled-GPIO-optional.patch
@@ -0,0 +1,75 @@
+From c37a9bec7d8d712c3dab63edaa1bb07f89f9c8ae Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede(a)redhat.com>
+Date: Thu, 15 Dec 2022 16:00:31 +0100
+Subject: [PATCH 5/7] sensors: Make "pled" GPIO optional
+
+Starting with kernel 6.3 the mainline int3472 driver models the privacy
+LED device as a LED class device rather then as a GPIO.
+
+As part of these changed the v4l2-core subdev code in 6.3 turns
+the LED on/off on s_stream() on/off calls on the sensor v4l2-subdev,
+so sensor drivers don't have to take care of this themselves.
+
+Change the devm_gpiod_get() calls for the "pled" GPIO into
+devm_gpiod_get_optional() calls so that the sensor drivers
+can work with both older kernel (controlling the GPIO) and
+with newer kernels which don't have a "pled" GPIO.
+
+Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
+---
+ drivers/media/i2c/hm11b1.c | 2 +-
+ drivers/media/i2c/ov01a1s.c | 2 +-
+ drivers/media/i2c/ov2740.c | 4 +---
+ 3 files changed, 3 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/media/i2c/hm11b1.c b/drivers/media/i2c/hm11b1.c
+index 652e8f177..6257f7987 100644
+--- a/drivers/media/i2c/hm11b1.c
++++ b/drivers/media/i2c/hm11b1.c
+@@ -1118,7 +1118,7 @@ static int hm11b1_parse_dt(struct hm11b1 *hm11b1)
+ return dev_err_probe(dev, PTR_ERR(hm11b1->clk), "getting clk\n");
+ #endif
+
+- hm11b1->pled_gpio = devm_gpiod_get(dev, "pled", GPIOD_OUT_HIGH);
++ hm11b1->pled_gpio = devm_gpiod_get_optional(dev, "pled", GPIOD_OUT_HIGH);
+ ret = PTR_ERR_OR_ZERO(hm11b1->pled_gpio);
+ if (ret < 0) {
+ dev_err(dev, "error while getting pled gpio: %d\n", ret);
+diff --git a/drivers/media/i2c/ov01a1s.c b/drivers/media/i2c/ov01a1s.c
+index 2ce81d04a..1bc619971 100644
+--- a/drivers/media/i2c/ov01a1s.c
++++ b/drivers/media/i2c/ov01a1s.c
+@@ -970,7 +970,7 @@ static int ov01a1s_parse_dt(struct ov01a1s *ov01a1s)
+ return dev_err_probe(dev, PTR_ERR(ov01a1s->clk), "getting clk\n");
+ #endif
+
+- ov01a1s->pled_gpio = devm_gpiod_get(dev, "pled", GPIOD_OUT_HIGH);
++ ov01a1s->pled_gpio = devm_gpiod_get_optional(dev, "pled",
GPIOD_OUT_HIGH);
+ ret = PTR_ERR_OR_ZERO(ov01a1s->pled_gpio);
+ if (ret < 0) {
+ dev_err(dev, "error while getting pled gpio: %d\n", ret);
+diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c
+index a8bb10177..08f284d4a 100644
+--- a/drivers/media/i2c/ov2740.c
++++ b/drivers/media/i2c/ov2740.c
+@@ -594,8 +594,6 @@ static u64 to_pixels_per_line(u32 hts, u32 f_index)
+
+ static void ov2740_set_power(struct ov2740 *ov2740, int on)
+ {
+- if (!(ov2740->reset_gpio && ov2740->pled_gpio))
+- return;
+ gpiod_set_value_cansleep(ov2740->reset_gpio, !on);
+ gpiod_set_value_cansleep(ov2740->pled_gpio, on);
+ msleep(20);
+@@ -633,7 +631,7 @@ static int ov2740_parse_dt(struct ov2740 *ov2740)
+ return ret;
+ }
+
+- ov2740->pled_gpio = devm_gpiod_get(dev, "pled", GPIOD_OUT_HIGH);
++ ov2740->pled_gpio = devm_gpiod_get_optional(dev, "pled", GPIOD_OUT_HIGH);
+ ret = PTR_ERR_OR_ZERO(ov2740->pled_gpio);
+ if (ret < 0) {
+ dev_err(dev, "error while getting pled gpio: %d\n", ret);
+--
+2.39.1
+
diff --git a/0006-ov01a1s-Drop-unused-link_freq-variable.patch
b/0006-ov01a1s-Drop-unused-link_freq-variable.patch
new file mode 100644
index 0000000..eae3eef
--- /dev/null
+++ b/0006-ov01a1s-Drop-unused-link_freq-variable.patch
@@ -0,0 +1,34 @@
+From 98babe1fd5c3a947d6a9adacd7a1199a8b2c8413 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede(a)redhat.com>
+Date: Tue, 29 Nov 2022 15:15:15 +0100
+Subject: [PATCH 6/7] ov01a1s: Drop unused link_freq variable
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Drop the unused link_freq variable, fixing this compiler warning:
+
+drivers/media/i2c/ov01a1s.c:994:13: warning: unused variable ‘link_freq’
[-Wunused-variable]
+ 994 | s64 link_freq;
+ | ^~~~~~~~~
+
+Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
+---
+ drivers/media/i2c/ov01a1s.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/media/i2c/ov01a1s.c b/drivers/media/i2c/ov01a1s.c
+index 1bc619971..ab4ff255d 100644
+--- a/drivers/media/i2c/ov01a1s.c
++++ b/drivers/media/i2c/ov01a1s.c
+@@ -988,7 +988,6 @@ static int ov01a1s_probe(struct i2c_client *client)
+ #if IS_ENABLED(CONFIG_INTEL_VSC)
+ struct vsc_mipi_config conf;
+ struct vsc_camera_status status;
+- s64 link_freq;
+ #endif
+
+ ov01a1s = devm_kzalloc(&client->dev, sizeof(*ov01a1s), GFP_KERNEL);
+--
+2.39.1
+
diff --git a/0007-Don-t-rename-the-already-registered-PCI-device.patch
b/0007-Don-t-rename-the-already-registered-PCI-device.patch
new file mode 100644
index 0000000..70c6fd6
--- /dev/null
+++ b/0007-Don-t-rename-the-already-registered-PCI-device.patch
@@ -0,0 +1,39 @@
+From ca47018d78159168a1eae12b1871d879cddcc9ba Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede(a)redhat.com>
+Date: Wed, 1 Feb 2023 16:14:08 +0100
+Subject: [PATCH 7/7] Don't rename the already registered PCI-device
+
+devices must not be renamed after they have already been
+added to the device hierarchy.
+
+dev_set_name() MUST only be called before dev_add()
+and the pci_dev passed to ipu_pci_probe() has been
+added long before ipu_pci_probe() runs, so it must
+not rename it.
+
+Renaming it is confusing udevd which now all of a sudden sees
+a device it already knows about change name.
+
+This is causing udev rules to not work properly with
+the ipu6-driver. Drop the clearly wrong dev_set_name() call.
+
+Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
+---
+ drivers/media/pci/intel/ipu.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/media/pci/intel/ipu.c b/drivers/media/pci/intel/ipu.c
+index f1a0be6d9..80ba8fb36 100644
+--- a/drivers/media/pci/intel/ipu.c
++++ b/drivers/media/pci/intel/ipu.c
+@@ -432,7 +432,6 @@ static int ipu_pci_probe(struct pci_dev *pdev, const struct
pci_device_id *id)
+ if (!isp)
+ return -ENOMEM;
+
+- dev_set_name(&pdev->dev, "intel-ipu");
+ isp->pdev = pdev;
+ INIT_LIST_HEAD(&isp->devices);
+
+--
+2.39.1
+
diff --git a/intel-ipu6-kmod.spec b/intel-ipu6-kmod.spec
new file mode 100644
index 0000000..6397637
--- /dev/null
+++ b/intel-ipu6-kmod.spec
@@ -0,0 +1,121 @@
+%if 0%{?fedora}
+%global buildforkernels akmod
+%global debug_package %{nil}
+%endif
+
+%global ipu6_commit f83b0747b297cc42325668aaf69471d89253b88e
+%global ipu6_commitdate 20230117
+%global ipu6_shortcommit %(c=%{ipu6_commit}; echo ${c:0:7})
+
+%global ivsc_commit 94ecb88b3ac238d9145ac16230d6e0779bb4fd32
+%global ivsc_commitdate 20230106
+%global ivsc_shortcommit %(c=%{ivsc_commit}; echo ${c:0:7})
+
+%global prjname intel-ipu6
+
+Name: %{prjname}-kmod
+Summary: Kernel module (kmod) for %{prjname}
+Version: 0.0
+Release: 3.%{ipu6_commitdate}git%{ipu6_shortcommit}%{?dist}
+License: GPLv2+
+
+URL:
https://github.com/intel
+Source0:
%{url}/ivsc-driver/archive/%{ivsc_commit}/ivsc-driver-%{ivsc_shortcommit}.tar.gz
+Source1:
%{url}/ipu6-drivers/archive/%{ipu6_commit}/ipu6-drivers-%{ipu6_shortcommit}.tar.gz
+
+
+# Patches
+Patch10: 0001-Fix-dmabuf-errors-with-kernel-6.2.patch
+Patch11: 0002-ipu6-psys-Fix-possible-deadlock-with-kernel-6.2.patch
+Patch12: 0003-sensors-Use-clk-framework-instead-of-a-clken-GPIO.patch
+Patch13: 0004-sensors-Make-powerdown-and-reset-signals-active-low-.patch
+Patch14: 0005-sensors-Make-pled-GPIO-optional.patch
+Patch15: 0006-ov01a1s-Drop-unused-link_freq-variable.patch
+Patch16: 0007-Don-t-rename-the-already-registered-PCI-device.patch
+
+
+BuildRequires: gcc
+BuildRequires: elfutils-libelf-devel
+BuildRequires: kmodtool
+%{!?kernels:BuildRequires:
buildsys-build-rpmfusion-kerneldevpkgs-%{?buildforkernels:%{buildforkernels}}%{!?buildforkernels:current}-%{_target_cpu}
}
+
+# kmodtool does its magic here
+%{expand:%(kmodtool --target %{_target_cpu} --repo rpmfusion --kmodname %{prjname}
%{?buildforkernels:--%{buildforkernels}} %{?kernels:--for-kernels "%{?kernels}"}
2>/dev/null) }
+
+%description
+This enables intel IPU6 image processor. The package includes Intel IPU6 and iVSC
drivers
+The source can be found from the following URL.
+https://github.com/intel/ipu6-drivers
+
+This package contains the kmod module for %{prjname}.
+
+
+%prep
+# error out if there was something wrong with kmodtool
+%{?kmodtool_check}
+
+# print kmodtool output for debugging purposes:
+kmodtool --target %{_target_cpu} --repo rpmfusion --kmodname %{prjname}
%{?buildforkernels:--%{buildforkernels}} %{?kernels:--for-kernels "%{?kernels}"}
2>/dev/null
+
+%setup -q -c -a 1
+(cd ipu6-drivers-%{ipu6_commit}
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+)
+
+cp -Rp ivsc-driver-%{ivsc_commit}/backport-include ipu6-drivers-%{ipu6_commit}/
+cp -Rp ivsc-driver-%{ivsc_commit}/drivers ipu6-drivers-%{ipu6_commit}/
+cp -Rp ivsc-driver-%{ivsc_commit}/include ipu6-drivers-%{ipu6_commit}/
+
+for kernel_version in %{?kernel_versions} ; do
+ cp -a ipu6-drivers-%{ipu6_commit}/ _kmod_build_${kernel_version%%___*}
+done
+
+
+%build
+for kernel_version in %{?kernel_versions} ; do
+ make -C ${kernel_version##*___} M=${PWD}/_kmod_build_${kernel_version%%___*} modules
+done
+
+%install
+for kernel_version in %{?kernel_versions}; do
+ mkdir -p
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/drivers/media/i2c/hi556.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/drivers/media/i2c/hi556.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/drivers/media/i2c/hm11b1.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/drivers/media/i2c/hm11b1.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/drivers/media/i2c/hm2170.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/drivers/media/i2c/hm2170.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/drivers/media/i2c/ov01a10.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/drivers/media/i2c/ov01a10.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/drivers/media/i2c/ov01a1s.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/drivers/media/i2c/ov01a1s.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/drivers/media/i2c/ov02c10.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/drivers/media/i2c/ov02c10.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/drivers/media/i2c/ov2740.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/drivers/media/i2c/ov2740.ko
+ install -D -m 755
_kmod_build_${kernel_version%%___*}/drivers/media/pci/intel/ipu6/intel-ipu6-isys.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/drivers/media/pci/intel/ipu6/intel-ipu6-isys.ko
+ install -D -m 755
_kmod_build_${kernel_version%%___*}/drivers/media/pci/intel/ipu6/intel-ipu6-psys.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/drivers/media/pci/intel/ipu6/intel-ipu6-psys.ko
+ install -D -m 755
_kmod_build_${kernel_version%%___*}/drivers/media/pci/intel/ipu6/intel-ipu6.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/drivers/media/pci/intel/ipu6/intel-ipu6.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/gpio-ljca.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/gpio-ljca.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/i2c-ljca.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/i2c-ljca.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/intel_vsc.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/intel_vsc.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/ljca.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/ljca.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/mei-vsc.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/mei-vsc.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/mei_ace.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/mei_ace.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/mei_ace_debug.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/mei_ace_debug.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/mei_csi.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/mei_csi.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/mei_pse.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/mei_pse.ko
+ install -D -m 755 _kmod_build_${kernel_version%%___*}/spi-ljca.ko
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/spi-ljca.ko
+ chmod a+x
%{buildroot}%{kmodinstdir_prefix}/${kernel_version%%___*}/%{kmodinstdir_postfix}/*.ko
+done
+%{?akmod_install}
+
+
+%changelog
+* Tue Mar 28 2023 Kate Hsuan <hpa(a)redhat.com> - 0.0-3.20230117gitf83b074
+- Fix typo
+
+* Mon Feb 6 2023 Kate Hsuan <hpa(a)redhat.com> - 0.0-2.20230117gitf83b074
+- Update ipu6 and ivsc driver
+
+* Wed Oct 26 2022 Kate Hsuan <hpa(a)redhat.com> - 0.0.1
+- First release
diff --git a/sources b/sources
index e69de29..e40f3a6 100644
--- a/sources
+++ b/sources
@@ -0,0 +1,2 @@
+SHA512 (ipu6-drivers-f83b074.tar.gz) =
4ee0895a03c5027b9ea55de32cc12f87559f15f07285b4e663843baf6061955df2986dc2b85ea3af91722a6a085991799fe96487aa350a13a9a5657567aeece3
+SHA512 (ivsc-driver-94ecb88.tar.gz) =
d4a94df8617bdef40abec01ee7c475ccd7601ef40bb0997b8c49fa48224565f3d5acc09f0a80d3c3a4da57135079f1bb4f8f99a401a4901d5434b2adb1396547