]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: synopsys: hdmirx: support use with sleeping GPIOs
authorMark Brown <broonie@kernel.org>
Mon, 2 Mar 2026 16:32:18 +0000 (16:32 +0000)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 11 Mar 2026 00:05:34 +0000 (01:05 +0100)
The recent change in commit 20cf2aed89ac ("gpio: rockchip: mark the GPIO
controller as sleeping") to mark the rockchip GPIO driver as sleeping
has started triggering the warning at drivers/gpio/gpiolib.c:3523
indicating that a sleepable GPIO was called via the non-sleeping APIs on
the Rock 5B:

<4>[   14.699308] Call trace:
<4>[   14.699545]  gpiod_get_value+0x90/0x98 (P)
<4>[   14.699928]  tx_5v_power_present+0x44/0xd0 [synopsys_hdmirx]
<4>[   14.700446]  hdmirx_delayed_work_hotplug+0x34/0x128 [synopsys_hdmirx]
<4>[   14.701031]  process_one_work+0x14c/0x28c
<4>[   14.701405]  worker_thread+0x184/0x300
<4>[   14.701756]  kthread+0x11c/0x128
<4>[   14.702065]  ret_from_fork+0x10/0x20

Currently the active use of the GPIO is all done from process context so
can be simply converted to use gpiod_get_value_cansleep(). There is one use
of the GPIO from hard interrupt context but this is only done so the status
can be displayed in a debug print so can simply be deleted without any
functional effect.

Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Acked-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c

index 9cceffa4ce25044e3a1661babfd864df472a3ec1..61ad20b18b8d6522607076f06d806fe11e9ff8d3 100644 (file)
@@ -232,7 +232,7 @@ static bool tx_5v_power_present(struct snps_hdmirx_dev *hdmirx_dev)
 
        for (i = 0; i < 10; i++) {
                usleep_range(1000, 1100);
-               val = gpiod_get_value(hdmirx_dev->detect_5v_gpio);
+               val = gpiod_get_value_cansleep(hdmirx_dev->detect_5v_gpio);
                if (val > 0)
                        cnt++;
                if (cnt >= detection_threshold)
@@ -2252,10 +2252,6 @@ static void hdmirx_delayed_work_res_change(struct work_struct *work)
 static irqreturn_t hdmirx_5v_det_irq_handler(int irq, void *dev_id)
 {
        struct snps_hdmirx_dev *hdmirx_dev = dev_id;
-       u32 val;
-
-       val = gpiod_get_value(hdmirx_dev->detect_5v_gpio);
-       v4l2_dbg(3, debug, &hdmirx_dev->v4l2_dev, "%s: 5v:%d\n", __func__, val);
 
        queue_delayed_work(system_unbound_wq,
                           &hdmirx_dev->delayed_work_hotplug,