From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C0358C5AD49 for ; Fri, 6 Jun 2025 12:33:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=qZCBEcS8YIw+wgMKXd51tBJsjHMgHFByuPRABLng6N0=; b=aOStPxnE49KmtkZGJ9+RyM9Vz6 J8jtzN1kuVYj1DGF+qA/bJaBgxm/HqnoEzG1mhlsU3RvXE3eBRXjGauJHrxbBeRI5T2YPTwqErp6e WpW7yC7eDcW6stCZkrfcc8NZL4PobfSuYp5pVElFw5QWLYcCDW4dJ7BsdULGgJnyA/Z+AHHtV4HED ddaZ3OqPqmiz0HpIBg25RiS5zdVAi4U/KHpRL0oDACPNfZywWNaltQC8UfiRJN74m0OW28hAL+vFd 8rwIsfmL/YNcM5Tfpv8bJmtNCoQJSctBMCWI671B5Hm4jfwecT39yU0isPwzzEQWaRm8KRROcQr/t EsXWCG5A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uNWGP-00000000FNS-2B6Y; Fri, 06 Jun 2025 12:33:37 +0000 Received: from perceval.ideasonboard.com ([213.167.242.64]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1uNVxf-00000000DRd-2gQj for linux-arm-kernel@lists.infradead.org; Fri, 06 Jun 2025 12:14:16 +0000 Received: from isaac-ThinkPad-T16-Gen-2.localdomain (cpc90716-aztw32-2-0-cust408.18-1.cable.virginm.net [86.26.101.153]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 64DE91340; Fri, 6 Jun 2025 14:14:09 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1749212050; bh=OF+fLFPhM40cHFI5sXwjSZI1LzZUrHhaXoT6cLwZwLA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tRwK5q6di5lo9Q0wUHSzJk10vOzi/8AYXUpYzqzuT3zS8AbVkWbyTP/PMFkIb/zzY jVSUHL6ieqmNocDlBiZLNfimXbij4nbn79OO88DjtGgo8lkaoXcPIml+Fst1aJlUdt vaa6sPqOvSthnAxGpvOAN7oDLSkz0b85Nc8d9BLw= From: Isaac Scott To: laurent.pinchart@ideasonboard.com Cc: kieran.bingham@ideasonboard.com, rmfrfs@gmail.com, martink@posteo.de, kernel@puri.sm, mchehab@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-media@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Isaac Scott Subject: [PATCH 1/2] media: platform: Refactor interrupt status registers Date: Fri, 6 Jun 2025 13:14:02 +0100 Message-ID: <20250606121403.498153-2-isaac.scott@ideasonboard.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250606121403.498153-1-isaac.scott@ideasonboard.com> References: <20250606121403.498153-1-isaac.scott@ideasonboard.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250606_051415_833658_46C216F1 X-CRM114-Status: GOOD ( 16.72 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The NXP i.MX 8 MP CSI-2 receiver features multiple interrupt and debug status sources which span multiple registers. The driver currently supports two interrupt source registers, and attributes the mipi_csis_event event entries to those registers through a boolean debug field that indicate if the event relates to the main interrupt status (false) or debug interrupt status (true) register. To make it easier to add new event fields, replace the debug bool with a 'status index' integer than indicates the index of the corresponding status register. Signed-off-by: Isaac Scott --- drivers/media/platform/nxp/imx-mipi-csis.c | 64 +++++++++++----------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c index d060eadebc7a..bbc549c22aff 100644 --- a/drivers/media/platform/nxp/imx-mipi-csis.c +++ b/drivers/media/platform/nxp/imx-mipi-csis.c @@ -249,7 +249,7 @@ #define MIPI_CSI2_DATA_TYPE_USER(x) (0x30 + (x)) struct mipi_csis_event { - bool debug; + unsigned int status_index; u32 mask; const char * const name; unsigned int counter; @@ -257,30 +257,30 @@ struct mipi_csis_event { static const struct mipi_csis_event mipi_csis_events[] = { /* Errors */ - { false, MIPI_CSIS_INT_SRC_ERR_SOT_HS, "SOT Error" }, - { false, MIPI_CSIS_INT_SRC_ERR_LOST_FS, "Lost Frame Start Error" }, - { false, MIPI_CSIS_INT_SRC_ERR_LOST_FE, "Lost Frame End Error" }, - { false, MIPI_CSIS_INT_SRC_ERR_OVER, "FIFO Overflow Error" }, - { false, MIPI_CSIS_INT_SRC_ERR_WRONG_CFG, "Wrong Configuration Error" }, - { false, MIPI_CSIS_INT_SRC_ERR_ECC, "ECC Error" }, - { false, MIPI_CSIS_INT_SRC_ERR_CRC, "CRC Error" }, - { false, MIPI_CSIS_INT_SRC_ERR_UNKNOWN, "Unknown Error" }, - { true, MIPI_CSIS_DBG_INTR_SRC_DT_NOT_SUPPORT, "Data Type Not Supported" }, - { true, MIPI_CSIS_DBG_INTR_SRC_DT_IGNORE, "Data Type Ignored" }, - { true, MIPI_CSIS_DBG_INTR_SRC_ERR_FRAME_SIZE, "Frame Size Error" }, - { true, MIPI_CSIS_DBG_INTR_SRC_TRUNCATED_FRAME, "Truncated Frame" }, - { true, MIPI_CSIS_DBG_INTR_SRC_EARLY_FE, "Early Frame End" }, - { true, MIPI_CSIS_DBG_INTR_SRC_EARLY_FS, "Early Frame Start" }, + { 0, MIPI_CSIS_INT_SRC_ERR_SOT_HS, "SOT Error"}, + { 0, MIPI_CSIS_INT_SRC_ERR_LOST_FS, "Lost Frame Start Error"}, + { 0, MIPI_CSIS_INT_SRC_ERR_LOST_FE, "Lost Frame End Error"}, + { 0, MIPI_CSIS_INT_SRC_ERR_OVER, "FIFO Overflow Error"}, + { 0, MIPI_CSIS_INT_SRC_ERR_WRONG_CFG, "Wrong Configuration Error"}, + { 0, MIPI_CSIS_INT_SRC_ERR_ECC, "ECC Error"}, + { 0, MIPI_CSIS_INT_SRC_ERR_CRC, "CRC Error"}, + { 0, MIPI_CSIS_INT_SRC_ERR_UNKNOWN, "Unknown Error"}, + { 1, MIPI_CSIS_DBG_INTR_SRC_DT_NOT_SUPPORT, "Data Type Not Supported"}, + { 1, MIPI_CSIS_DBG_INTR_SRC_DT_IGNORE, "Data Type Ignored"}, + { 1, MIPI_CSIS_DBG_INTR_SRC_ERR_FRAME_SIZE, "Frame Size Error"}, + { 1, MIPI_CSIS_DBG_INTR_SRC_TRUNCATED_FRAME, "Truncated Frame"}, + { 1, MIPI_CSIS_DBG_INTR_SRC_EARLY_FE, "Early Frame End"}, + { 1, MIPI_CSIS_DBG_INTR_SRC_EARLY_FS, "Early Frame Start"}, /* Non-image data receive events */ - { false, MIPI_CSIS_INT_SRC_EVEN_BEFORE, "Non-image data before even frame" }, - { false, MIPI_CSIS_INT_SRC_EVEN_AFTER, "Non-image data after even frame" }, - { false, MIPI_CSIS_INT_SRC_ODD_BEFORE, "Non-image data before odd frame" }, - { false, MIPI_CSIS_INT_SRC_ODD_AFTER, "Non-image data after odd frame" }, + { 0, MIPI_CSIS_INT_SRC_EVEN_BEFORE, "Non-image data before even frame"}, + { 0, MIPI_CSIS_INT_SRC_EVEN_AFTER, "Non-image data after even frame"}, + { 0, MIPI_CSIS_INT_SRC_ODD_BEFORE, "Non-image data before odd frame"}, + { 0, MIPI_CSIS_INT_SRC_ODD_AFTER, "Non-image data after odd frame"}, /* Frame start/end */ - { false, MIPI_CSIS_INT_SRC_FRAME_START, "Frame Start" }, - { false, MIPI_CSIS_INT_SRC_FRAME_END, "Frame End" }, - { true, MIPI_CSIS_DBG_INTR_SRC_CAM_VSYNC_FALL, "VSYNC Falling Edge" }, - { true, MIPI_CSIS_DBG_INTR_SRC_CAM_VSYNC_RISE, "VSYNC Rising Edge" }, + { 0, MIPI_CSIS_INT_SRC_FRAME_START, "Frame Start"}, + { 0, MIPI_CSIS_INT_SRC_FRAME_END, "Frame End"}, + { 1, MIPI_CSIS_DBG_INTR_SRC_CAM_VSYNC_FALL, "VSYNC Falling Edge"}, + { 1, MIPI_CSIS_DBG_INTR_SRC_CAM_VSYNC_RISE, "VSYNC Rising Edge"}, }; #define MIPI_CSIS_NUM_EVENTS ARRAY_SIZE(mipi_csis_events) @@ -765,32 +765,30 @@ static irqreturn_t mipi_csis_irq_handler(int irq, void *dev_id) struct mipi_csis_device *csis = dev_id; unsigned long flags; unsigned int i; - u32 status; - u32 dbg_status; + u32 status[2]; - status = mipi_csis_read(csis, MIPI_CSIS_INT_SRC); - dbg_status = mipi_csis_read(csis, MIPI_CSIS_DBG_INTR_SRC); + status[0] = mipi_csis_read(csis, MIPI_CSIS_INT_SRC); + status[1] = mipi_csis_read(csis, MIPI_CSIS_DBG_INTR_SRC); spin_lock_irqsave(&csis->slock, flags); /* Update the event/error counters */ - if ((status & MIPI_CSIS_INT_SRC_ERRORS) || csis->debug.enable) { + if ((status[0] & MIPI_CSIS_INT_SRC_ERRORS) || csis->debug.enable) { for (i = 0; i < MIPI_CSIS_NUM_EVENTS; i++) { struct mipi_csis_event *event = &csis->events[i]; - if ((!event->debug && (status & event->mask)) || - (event->debug && (dbg_status & event->mask))) + if (status[event->status_index] & event->mask) event->counter++; } } - if (status & MIPI_CSIS_INT_SRC_FRAME_START) + if (status[0] & MIPI_CSIS_INT_SRC_FRAME_START) mipi_csis_queue_event_sof(csis); spin_unlock_irqrestore(&csis->slock, flags); - mipi_csis_write(csis, MIPI_CSIS_INT_SRC, status); - mipi_csis_write(csis, MIPI_CSIS_DBG_INTR_SRC, dbg_status); + mipi_csis_write(csis, MIPI_CSIS_INT_SRC, status[0]); + mipi_csis_write(csis, MIPI_CSIS_DBG_INTR_SRC, status[1]); return IRQ_HANDLED; } -- 2.43.0