Received: by 2002:ab2:6857:0:b0:1ef:ffd0:ce49 with SMTP id l23csp2527477lqp; Mon, 25 Mar 2024 01:12:30 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXrGcQLkm7MjPUAWmbrdA5BlY94jl3x43NfFlgAT4eLlPKBgTtuoVTV3XRB0zzRyouzUS/ZCUgkF8YJ5MceltrNlMn0Pona/9fhAStJIw== X-Google-Smtp-Source: AGHT+IHCGJue4dW8fQeZbHbtve5Oitq+iMcH0yErwZsDAtPFiz/vmmE5O3PDEJXLhXupz9HrWu6y X-Received: by 2002:a05:6808:f0c:b0:3c3:d2df:6433 with SMTP id m12-20020a0568080f0c00b003c3d2df6433mr905817oiw.49.1711354350228; Mon, 25 Mar 2024 01:12:30 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711354350; cv=pass; d=google.com; s=arc-20160816; b=Gvp2mJYaUxDGJbFrf+/e4VCUkzv8ehOfnhOGCCR7KHlhV3LcDnD3nDMz53aiudUIsW 8k/yNprVSl20Miu0l+mETSCDFdHNdfyQynN4khgjxhwZcnBnYjgYuZ7wO9mTyWGCwKtJ 17U9npVLaWM+hkcDNy1IB99P422v/wO2wW7Bfd4QLn8NDe6vQJih+/12LKsYWGffIPBS YFLP2JDtzgNipUOdTDY9ui+i9lylvArKeM9Kj0GmCGAtU6MXlG2f5G+aYTxblsTlKIkH mHdoho++Jl7PE7uWpBbDULC0OTweMwmTlxOJBZd9izsoM7p32DQ2P6huIVuo0rTKjoaK 47qQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=Ko3qR4lQeVOoBn9b0KmgoU1RfwnZ6Q65QRiLFTx8zfc=; fh=CflZd/UjTEL0U971TNAGMlm0Kq2LOCzbT6mMLVWlNSQ=; b=AoTu8JfpGV3upSDaPObBHZzJzvgQlIAy0e0hWf5zX05rczM54Pa7RmXyS4ML/3Ny/c bt1e1Z0OAlq2H5PhvliOeG/RVsaLP140noUfLOVtaSNzYyyA8i620W/vLeOOePimR/Pz L0efo2FQmgV7j285XixuL+VwYe9RUFX/0/0xR7QQOO6ioCeVxtSR+Qumj7U7vWtXTKnA v1SUT+W3m9yC6kNdAI7gUrZGfvHZ6q5PSyF/E7M4uufWX44VXAdVrSJHcSbcz63HH/uv tgEjv+hxO9kVhw8NG451+GZxkMGfXtrwhwu7lfVaxmWLpfk2FgybBQOFYQ/OvsdfXjSQ 7oEw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=hVULR1W+; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-115588-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-115588-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id gx5-20020a056a001e0500b006e72d056ae5si4605090pfb.276.2024.03.25.01.12.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Mar 2024 01:12:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-115588-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=hVULR1W+; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-115588-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-115588-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 48D72B2D4F7 for ; Mon, 25 Mar 2024 07:49:38 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 24CE216A1FD; Mon, 25 Mar 2024 02:47:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hVULR1W+" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 990E31FA809; Sun, 24 Mar 2024 23:01:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711321284; cv=none; b=h1KEvhrTrhOwIG+M+8omXMgZt0FRhpPDBqQ7wrqeV6ErDPdWa3Fb4IysHxG0QEI2+1nSaVwvLpmyny9nLQ/kx6/6t12H175x75UBOhaEmcLMRRqTgHo9q0bc6Wa9IyKCNgiWBo/5/CUjkAo36ik7V5pBnDod6JMTj1M8VLe6AO8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711321284; c=relaxed/simple; bh=JvLxDW07Gt/27exbqBLUQLZ3ITh8Gwx3ZVFx5ssdy/Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lG7l8adNEnADSrDpQyjgHXHVdOWJkI9bJKp+dHuuvbmtg1h5vhEhM+kWDnevFkcqZCY9prpew+HDFWxe7ntajr4Klc0IVyM+HX8pk7PAbuOeQqt3NRoJtHipo9mqcAgqU8PS6XWvIzJm7cMfvkIFN0AZakB3LFe+Jub3bF4wGSk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hVULR1W+; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id C0914C43394; Sun, 24 Mar 2024 23:01:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1711321283; bh=JvLxDW07Gt/27exbqBLUQLZ3ITh8Gwx3ZVFx5ssdy/Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hVULR1W+CXCvbuQFrL10qg1Uj+2Hg75RNLz3rkPU2gem7jaZ94dWpS/b5OcqBOvHb fM+RCx+GbSqAL10nFqYtVmgSGcrn2NL0xLwrqfGK32yDQQc7f64qy9bzgwCA+OWoyg fdr0/9EgO+ZFmw0Tr9ShulrNdA/dhph2LG7ujCW2iMYA1FgfLpKKq48e6ZuQA0GkqW m43iEHviiSnAMImt3hE+B6QV2pkPNUEn5gUsQsml0x09xnqGxHr2R/ZINtdico82Nk b/wvnRvTq5p16KWVmcV1vxV1WEGYaBpNQdxcAujjAYy2M9hIHe3cVQjngSg1a91OmM rLX49l49wsoEw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Tomi Valkeinen , Laurent Pinchart , Mauro Carvalho Chehab , Sasha Levin Subject: [PATCH 6.6 005/638] media: rkisp1: Fix IRQ handling due to shared interrupts Date: Sun, 24 Mar 2024 18:50:42 -0400 Message-ID: <20240324230116.1348576-6-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240324230116.1348576-1-sashal@kernel.org> References: <20240324230116.1348576-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit From: Tomi Valkeinen [ Upstream commit ffb635bb398fc07cb38f8a7b4a82cbe5f412f08e ] The driver requests the interrupts as IRQF_SHARED, so the interrupt handlers can be called at any time. If such a call happens while the ISP is powered down, the SoC will hang as the driver tries to access the ISP registers. This can be reproduced even without the platform sharing the IRQ line: Enable CONFIG_DEBUG_SHIRQ and unload the driver, and the board will hang. Fix this by adding a new field, 'irqs_enabled', which is used to bail out from the interrupt handler when the ISP is not operational. Link: https://lore.kernel.org/r/20231218-rkisp-shirq-fix-v1-2-173007628248@ideasonboard.com Signed-off-by: Tomi Valkeinen Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Sasha Levin --- .../platform/rockchip/rkisp1/rkisp1-capture.c | 3 +++ .../platform/rockchip/rkisp1/rkisp1-common.h | 2 ++ .../platform/rockchip/rkisp1/rkisp1-csi.c | 3 +++ .../platform/rockchip/rkisp1/rkisp1-dev.c | 22 +++++++++++++++++++ .../platform/rockchip/rkisp1/rkisp1-isp.c | 3 +++ 5 files changed, 33 insertions(+) diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c index 8f3cba3197623..c584bb6d31998 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c @@ -723,6 +723,9 @@ irqreturn_t rkisp1_capture_isr(int irq, void *ctx) unsigned int i; u32 status; + if (!rkisp1->irqs_enabled) + return IRQ_NONE; + status = rkisp1_read(rkisp1, RKISP1_CIF_MI_MIS); if (!status) return IRQ_NONE; diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h b/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h index 104a1dbeff433..e9bc6c155d2fc 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h @@ -467,6 +467,7 @@ struct rkisp1_debug { * @debug: debug params to be exposed on debugfs * @info: version-specific ISP information * @irqs: IRQ line numbers + * @irqs_enabled: the hardware is enabled and can cause interrupts */ struct rkisp1_device { void __iomem *base_addr; @@ -488,6 +489,7 @@ struct rkisp1_device { struct rkisp1_debug debug; const struct rkisp1_info *info; int irqs[RKISP1_NUM_IRQS]; + bool irqs_enabled; }; /* diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c index 0a67eb96402cb..1537dccbd2e28 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c @@ -211,6 +211,9 @@ irqreturn_t rkisp1_csi_isr(int irq, void *ctx) struct rkisp1_device *rkisp1 = dev_get_drvdata(dev); u32 val, status; + if (!rkisp1->irqs_enabled) + return IRQ_NONE; + status = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_MIS); if (!status) return IRQ_NONE; diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c index acc559652d6eb..73cf08a740118 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c @@ -305,6 +305,24 @@ static int __maybe_unused rkisp1_runtime_suspend(struct device *dev) { struct rkisp1_device *rkisp1 = dev_get_drvdata(dev); + rkisp1->irqs_enabled = false; + /* Make sure the IRQ handler will see the above */ + mb(); + + /* + * Wait until any running IRQ handler has returned. The IRQ handler + * may get called even after this (as it's a shared interrupt line) + * but the 'irqs_enabled' flag will make the handler return immediately. + */ + for (unsigned int il = 0; il < ARRAY_SIZE(rkisp1->irqs); ++il) { + if (rkisp1->irqs[il] == -1) + continue; + + /* Skip if the irq line is the same as previous */ + if (il == 0 || rkisp1->irqs[il - 1] != rkisp1->irqs[il]) + synchronize_irq(rkisp1->irqs[il]); + } + clk_bulk_disable_unprepare(rkisp1->clk_size, rkisp1->clks); return pinctrl_pm_select_sleep_state(dev); } @@ -321,6 +339,10 @@ static int __maybe_unused rkisp1_runtime_resume(struct device *dev) if (ret) return ret; + rkisp1->irqs_enabled = true; + /* Make sure the IRQ handler will see the above */ + mb(); + return 0; } diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c index 2239fb6c7d393..8fc9c1c116f1d 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c @@ -1027,6 +1027,9 @@ irqreturn_t rkisp1_isp_isr(int irq, void *ctx) struct rkisp1_device *rkisp1 = dev_get_drvdata(dev); u32 status, isp_err; + if (!rkisp1->irqs_enabled) + return IRQ_NONE; + status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_MIS); if (!status) return IRQ_NONE; -- 2.43.0