From 4fc7543c31a2dbb88ee087c0b1891a604c5c7380 Mon Sep 17 00:00:00 2001 From: Chen Shunqing Date: Tue, 14 May 2024 16:37:49 +0800 Subject: [PATCH] media: i2c: rk628: fix interrupts can be triggered in suspend Signed-off-by: Chen Shunqing Change-Id: I39955e126729c9ec1ffabcd53d3bc679d354cd0f --- drivers/media/i2c/rk628/rk628.h | 1 + drivers/media/i2c/rk628/rk628_bt1120_v4l2.c | 7 +++++++ drivers/media/i2c/rk628/rk628_csi_v4l2.c | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/drivers/media/i2c/rk628/rk628.h b/drivers/media/i2c/rk628/rk628.h index e331e26f0f74..a35bba051390 100644 --- a/drivers/media/i2c/rk628/rk628.h +++ b/drivers/media/i2c/rk628/rk628.h @@ -308,6 +308,7 @@ struct rk628 { struct dentry *debug_dir; struct gpio_desc *hdmirx_det_gpio; bool last_mipi_status; + bool is_suspend; }; #define rk628_dbg(rk628, format, ...) \ diff --git a/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c b/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c index 67c350b811a5..4e24bc4f680b 100644 --- a/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c +++ b/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c @@ -252,6 +252,8 @@ static bool tx_5v_power_present(struct v4l2_subdev *sd) ret = rk628_hdmirx_tx_5v_power_detect(bt1120->plugin_det_gpio); v4l2_dbg(2, debug, sd, "%s: %d\n", __func__, ret); + if (bt1120->rk628->is_suspend) + ret = false; return ret; } @@ -1770,9 +1772,11 @@ static int rk628_bt1120_resume(struct device *dev) rk628_cru_initialize(bt1120->rk628); rk628_bt1120_initial(sd); rk628_hdmirx_plugout(sd); + enable_irq(bt1120->plugin_irq); enable_irq(bt1120->hdmirx_irq); schedule_delayed_work(&bt1120->delayed_work_enable_hotplug, msecs_to_jiffies(500)); + bt1120->rk628->is_suspend = false; return 0; } @@ -1785,6 +1789,9 @@ static int rk628_bt1120_suspend(struct device *dev) v4l2_info(sd, "%s: suspend!\n", __func__); + bt1120->rk628->is_suspend = true; + rk628_hdmirx_plugout(sd); + disable_irq(bt1120->plugin_irq); disable_irq(bt1120->hdmirx_irq); cancel_delayed_work_sync(&bt1120->delayed_work_res_change); cancel_delayed_work_sync(&bt1120->delayed_work_enable_hotplug); diff --git a/drivers/media/i2c/rk628/rk628_csi_v4l2.c b/drivers/media/i2c/rk628/rk628_csi_v4l2.c index 2a53a1107c71..2ff0a1ce11cc 100644 --- a/drivers/media/i2c/rk628/rk628_csi_v4l2.c +++ b/drivers/media/i2c/rk628/rk628_csi_v4l2.c @@ -383,6 +383,8 @@ static bool tx_5v_power_present(struct v4l2_subdev *sd) ret = rk628_hdmirx_tx_5v_power_detect(csi->plugin_det_gpio); v4l2_dbg(2, debug, sd, "%s: %d\n", __func__, ret); + if (csi->rk628->is_suspend) + ret = false; return ret; } @@ -3009,9 +3011,11 @@ static int rk628_csi_resume(struct device *dev) rk628_cru_initialize(csi->rk628); rk628_csi_initial(sd); rk628_hdmirx_plugout(sd); + enable_irq(csi->plugin_irq); enable_irq(csi->hdmirx_irq); schedule_delayed_work(&csi->delayed_work_enable_hotplug, msecs_to_jiffies(500)); + csi->rk628->is_suspend = false; return 0; } @@ -3024,6 +3028,9 @@ static int rk628_csi_suspend(struct device *dev) v4l2_info(sd, "%s: suspend!\n", __func__); + csi->rk628->is_suspend = true; + rk628_hdmirx_plugout(sd); + disable_irq(csi->plugin_irq); disable_irq(csi->hdmirx_irq); cancel_delayed_work_sync(&csi->delayed_work_res_change); cancel_delayed_work_sync(&csi->delayed_work_enable_hotplug);