armbian_build/patch/kernel/archive/sunxi-6.6/patches.megous/media-gc2145-implement-system-suspend.patch
Gunjan Gupta d1186b8a0e kernel: sunxi: Add patches for 6.6 kernel
I have changed the way the patches are generated a bit. Instead of using orange-pi branch from megous tree for 6.6 kernel, I have used the following kernel branches

	a83t-suspend, af8133j, anx, audio,
	axp, cam, drm, err, fixes, mbus,
	modem, opi3, pb, pinetab, pp, ppkb,
	samuel, speed, tbs-a711, ths

These branches were carefully chosen to include only allwinner related patches and remove importing of the rockchip related patches into the allwinner kernel.

Following patches are modified to fix patch application failure
- patches.armbian/arm64-dts-sun50i-h616-orangepi-zero2-reg_usb1_vbus-status-ok.patch
- patches.armbian/arm64-dts-sun50i-h616-orangepi-zero2-Enable-GPU-mali.patch
- patches.armbian/arm64-dts-allwinner-h616-Add-efuse_xlate-cpu-frequency-scaling-v1_6_2.patch
- patches.armbian/arm64-dts-allwinner-h616-LED-green_power_on-red_status_heartbeat.patch
- patches.armbian/arm64-dts-allwinner-overlay-Add-Overlays-for-sunxi64.patch
- patches.armbian/arm64-dts-sun50i-h616-bigtreetech-cb1.patch

Following patches are modified because of kernel api change to fix compilation failure
- patches.armbian/drv-gpu-drm-sun4i-Add-HDMI-audio-sun4i-hdmi-encoder.patch
- patches.armbian/drv-of-Device-Tree-Overlay-ConfigFS-interface.patch
2023-10-30 22:58:11 +05:30

73 lines
1.9 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Andrey Skvortsov <andrej.skvortzov@gmail.com>
Date: Mon, 14 Aug 2023 13:27:08 +0300
Subject: media: gc2145: implement system suspend
If system was suspended while camera sensor was used, data and
interrupts were still coming from sensor and that caused unstable
system. Sometimes system hanged during a resume.
Signed-off-by: Andrey Skvortsov <andrej.skvortzov@gmail.com>
---
drivers/media/i2c/gc2145.c | 37 ++++++++++
1 file changed, 37 insertions(+)
diff --git a/drivers/media/i2c/gc2145.c b/drivers/media/i2c/gc2145.c
index 704bf8953bf8..d5d97e07c38e 100644
--- a/drivers/media/i2c/gc2145.c
+++ b/drivers/media/i2c/gc2145.c
@@ -2273,6 +2273,42 @@ static void gc2145_remove(struct i2c_client *client)
v4l2_ctrl_handler_free(&sensor->ctrls.handler);
}
+static int gc2145_sensor_suspend(struct device *dev)
+{
+ struct v4l2_subdev *sd = dev_get_drvdata(dev);
+ struct gc2145_dev *sensor = to_gc2145_dev(sd);
+
+ mutex_lock(&sensor->lock);
+ if (sensor->streaming)
+ gc2145_set_stream(sensor, false);
+ mutex_unlock(&sensor->lock);
+
+ return 0;
+}
+
+static int gc2145_sensor_resume(struct device *dev)
+{
+ struct v4l2_subdev *sd = dev_get_drvdata(dev);
+ struct gc2145_dev *sensor = to_gc2145_dev(sd);
+ int ret = 0;
+
+ mutex_lock(&sensor->lock);
+ if (sensor->streaming) {
+ ret = gc2145_set_stream(sensor, true);
+ if (ret) {
+ gc2145_set_stream(sensor, false);
+ sensor->streaming = false;
+ }
+ }
+ mutex_unlock(&sensor->lock);
+
+ return ret;
+}
+
+static const struct dev_pm_ops gc2145_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(gc2145_sensor_suspend, gc2145_sensor_resume)
+};
+
static const struct i2c_device_id gc2145_id[] = {
{"gc2145", 0},
{},
@@ -2289,6 +2325,7 @@ static struct i2c_driver gc2145_i2c_driver = {
.driver = {
.name = "gc2145",
.of_match_table = gc2145_dt_ids,
+ .pm = &gc2145_pm_ops,
},
.id_table = gc2145_id,
.probe = gc2145_probe,
--
Armbian