Re: [PATCH v2 6/8] media: platform: Add NXP Neoisp Image Signal Processor

From: Antoine Bouyer

Date: Mon May 11 2026 - 10:51:58 EST


On 5/11/26 3:26 PM, Antoine Bouyer wrote:
First NXP neoisp driver version with the following contents:

This driver was initially inspired from raspberrypi pisp_be driver. It
reuses same approach for ISP job scheduling.

The Neoisp driver supports:
* 8, 10, 12, 14 and 16-bits RAW Bayer images input.
* Monochrome sensors input.
* RGB/YUV, IR and Greyscale output formats.

The neoisp features are:
* Provides single context to limit amount of v4l2 devices.
* Supports M2M operations.
* Support SDR and HDR modes.
* Supports generic v4l2-isp framework for extensible Parameters and
Statistics buffers.
* Provides a `core_media_register` API to register neoisp's media entities
into another media graph.
* A module parameter to run in standalone mode with its own media device.

Co-developed-by: Alexi Birlinger <alexi.birlinger@xxxxxxx>
Signed-off-by: Alexi Birlinger <alexi.birlinger@xxxxxxx>
Signed-off-by: Antoine Bouyer <antoine.bouyer@xxxxxxx>
---
MAINTAINERS | 9 +
drivers/media/platform/nxp/Kconfig | 1 +
drivers/media/platform/nxp/Makefile | 1 +
drivers/media/platform/nxp/neoisp/Kconfig | 16 +
drivers/media/platform/nxp/neoisp/Makefile | 6 +
drivers/media/platform/nxp/neoisp/neoisp.h | 247 ++
.../media/platform/nxp/neoisp/neoisp_core.h | 30 +
.../media/platform/nxp/neoisp/neoisp_ctx.c | 2657 +++++++++++++++++
.../media/platform/nxp/neoisp/neoisp_ctx.h | 78 +
.../media/platform/nxp/neoisp/neoisp_fmt.h | 495 +++
drivers/media/platform/nxp/neoisp/neoisp_hw.h | 557 ++++
.../media/platform/nxp/neoisp/neoisp_main.c | 1899 ++++++++++++
.../media/platform/nxp/neoisp/neoisp_nodes.h | 54 +
.../media/platform/nxp/neoisp/neoisp_regs.h | 2498 ++++++++++++++++
include/uapi/linux/media/nxp/nxp_neoisp.h | 67 -
15 files changed, 8548 insertions(+), 67 deletions(-)
create mode 100644 drivers/media/platform/nxp/neoisp/Kconfig
create mode 100644 drivers/media/platform/nxp/neoisp/Makefile
create mode 100644 drivers/media/platform/nxp/neoisp/neoisp.h
create mode 100644 drivers/media/platform/nxp/neoisp/neoisp_core.h
create mode 100644 drivers/media/platform/nxp/neoisp/neoisp_ctx.c
create mode 100644 drivers/media/platform/nxp/neoisp/neoisp_ctx.h
create mode 100644 drivers/media/platform/nxp/neoisp/neoisp_fmt.h
create mode 100644 drivers/media/platform/nxp/neoisp/neoisp_hw.h
create mode 100644 drivers/media/platform/nxp/neoisp/neoisp_main.c
create mode 100644 drivers/media/platform/nxp/neoisp/neoisp_nodes.h
create mode 100644 drivers/media/platform/nxp/neoisp/neoisp_regs.h


[snip]

diff --git a/drivers/media/platform/nxp/neoisp/neoisp_ctx.c b/drivers/media/platform/nxp/neoisp/neoisp_ctx.c
new file mode 100644
index 000000000000..cbb50257be57
--- /dev/null
+++ b/drivers/media/platform/nxp/neoisp/neoisp_ctx.c
@@ -0,0 +1,2657 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * NEOISP context registers/memory setting helpers
+ *
+ * Copyright 2023-2026 NXP
+ */
[snip]

+void neoisp_ctx_get_stats(struct neoisp_dev_s *neoispd, struct neoisp_buffer_s *buf)
+{
+ struct neoisp_node_s *node = &neoispd->node[NEOISP_STATS_NODE];
+ u8 *src = (u8 *)(uintptr_t)neoispd->mmio_tcm;
+ struct v4l2_isp_buffer *stats;
+ u32 *blk_list, count;
+
+ /* Check if stats node link is enabled */
+ if (!neoisp_node_link_is_enabled(node))
+ return;
+
+ if (IS_ERR_OR_NULL(buf) || IS_ERR_OR_NULL(src)) {
+ dev_err(neoispd->dev, "Error: stats pointer\n");
+ return;
+ }
+
+ stats = (struct v4l2_isp_buffer *)get_vaddr(buf);
+ v4l2_isp_stats_init_buffer(stats, V4L2_ISP_VERSION_V1);
+
+ blk_list = (u32 *)neoisp_stats_blocks;
+ count = ARRAY_SIZE(neoisp_stats_blocks);
+ for (int i = 0; i < count; i++) {
+ struct v4l2_isp_block_header *header =
+ v4l2_isp_stats_init_block(neoispd->dev, stats,
+ neoisp_stats_block_types_info,
+ ARRAY_SIZE(neoisp_stats_block_types_info),
+ blk_list[i], NEOISP_EXT_STATS_MAX_SIZE);
+ if (!header) {

oops. I missed to apply the fix on my driver :(

IS_ERR(header) must be used instead of null pointer check.

+ dev_err(neoispd->dev, "Error: initializing stats block %d\n", i);
+ continue;
+ }
+
+ neoisp_ctx_get_stats_blk(neoispd, blk_list[i], src,
+ (union neoisp_stats_block_u *)header);
+ }
+}