From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3157B380FD3 for ; Thu, 25 Jun 2026 08:21:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.50 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782375690; cv=none; b=QfI+3pKo30OEeSSf0AgBQ3G9O2i9RAJQK1uO+v291iWprOn6MlgkNj4oSzBM/njuGP55LnMXWiQxw9f39HQ0eJ084h1EzvlQry0aKNXwMzroDuNUKP0qlkHe4e+ynYlUcn8b4mi8075UPlraRO5Zx6YqZtAEcZIPTG3QTTDhaas= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782375690; c=relaxed/simple; bh=gSX6KqPA/5Nw3cjKmpw31wmT3V1bR1hYOq73V9FJfu0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=piWDQInCoURhKsEb5NAlIFSc9TCPU75TqAnTvKOpIMvQbNOGTAl+kWTk9X6vZOJaucysIHq781xnm9hpEu1Gm2243jkqmsQHww/G+gDwdxko4bjalmcm50lGogdPyG7ohQjLnjQb9Lau/AZveXDeSSN2CnWBzfqIRy689eHzm0E= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GSxvDqIo; arc=none smtp.client-ip=209.85.167.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GSxvDqIo" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-5ad58584037so1750252e87.3 for ; Thu, 25 Jun 2026 01:21:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782375684; x=1782980484; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mXp2EXE6kultyDnkZ6jPOv1Hatsx2+KE38CNHXZv9vA=; b=GSxvDqIoy2WheW7ttla+gKI+01XjejmB1Yi6bMp52XaG9PU6OEeO+4e80wfmULmHf0 q3cWwyx+1oBqOAk6H0QJiNj04vdVU2Rmyfmtk/6NaR6MnGBQPDA6C8wxV6lgFteu6aN3 zSCyI+KkyW/zhewgr7cYMXxb6RMsJRg7S6jMluIY0DSOjRLZ8o3DLPvOQ/oOO9kvhVts hDRXrUFhZaQbYkmF00Jj7gjC2ZqI1gRctA7+OPBcR4zOYW/XQ8g6vyIZONIbA67+hvnu N72zRk49bgAG9hOJPhglz30kIdLgxhXnrtC91VYcrnPqfHpHkaO+IDtmTJSEgZMcl8eJ dEQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782375684; x=1782980484; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=mXp2EXE6kultyDnkZ6jPOv1Hatsx2+KE38CNHXZv9vA=; b=l6MCa/PkIsVeK40dbhOwJzcV/oxzLvndbAN9nLQcRYLQ5eSUP63KgdwO2EBV2RvMWW czgbpfQFyq01Qj6IHYZsvjjZqNxC/gJ6Esbx3bpWBUJnZ5mTHc9XV7ixPMm9xze938c8 tHt0RaaxuEcTbMs1Ef3PaG+/JQK4xGG01qF1S2lnmWAdfiFcnLwEnNDP5Ik/xW9rZGug ajqC8Uc9nsp30rA9cmDkcTpQe2pC5SHpDU7RZ9Pown7/3LlViybpnJiWiWD4YT5+SJqE BmuC/5GYsOZP1DxDPqExqMrwJ0mCl1qtEt6hygoijB1rj10FbdkC0HHeJxxcV9Utpv1/ nqlw== X-Forwarded-Encrypted: i=1; AHgh+RrjK8/o7zE1/wnnUzi0AleChyNBrJuWHJe8AmrqTbtOMLReZ0lwnSXlehCSrA7Ubq8miZM49jNegiDaKx0=@vger.kernel.org X-Gm-Message-State: AOJu0YzPH6mq0PNIUSj5MOQjmqJWLOVFGprcC+81rYrJjRyvhFQgakNN DpFV70OphQRcu7OsgGXpL5zC2dfZ1RHf5ET4tjKpo90emb/P8CgWLPou X-Gm-Gg: AfdE7ck270P/J69AoOMERbREPT25uqd8qXErNayfZWaAkQckPdEJhmK2eCG0Ir8D2Q5 TSvqCgb4oNm+Fc5ht5AgkIoOPCgWFxQQYuuz+/9XR7z46aNzA3xc3zRjADLb1gqmwu8FUDrIsg+ ejxwQXmSFyB9waYFSN7qoEKgFKzNgjz6yGl7QGk7DdXW3Uk4eoUD7ZGfO22jzFjqo2RFa1AIuCE 5gexfDXKFt/etWtPzPUZWh3hqApSiwIfJCvf8Mw1uQCLHtNoq0Wdv3Z4/GhAnz5rLZQT+eGiL+a lsRmYfcgySWr1U1ao4Qi0Pt6BCNy39tJm8kVpDrX5dfO5OSBpeooBMjXvxZRFeEbJjpKlHZWY+S VOjNSjeej5SY3/OvTyn6QA3ezNh8nWjdTtLFXIEdHgkRfxWKm0OyL5AeAdPWz1/tXoy1fOpHNww K1+EdwKO2H9GNAncXRvl3MBujZO/Y8rbz4Iw== X-Received: by 2002:a05:6512:6712:b0:5ad:4ef1:7968 with SMTP id 2adb3069b0e04-5aea1f47f27mr417867e87.17.1782375684080; Thu, 25 Jun 2026 01:21:24 -0700 (PDT) Received: from xeon ([188.163.112.61]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5ad69580f73sm2430529e87.63.2026.06.25.01.21.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 01:21:23 -0700 (PDT) From: Svyatoslav Ryhel To: Sakari Ailus , Laurent Pinchart , Mauro Carvalho Chehab , Svyatoslav Ryhel Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 1/1 RESEND] media: i2c: mt9m114: Add get_fwnode_pad operation for IFP Date: Thu, 25 Jun 2026 11:21:11 +0300 Message-ID: <20260625082111.47898-2-clamor95@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260625082111.47898-1-clamor95@gmail.com> References: <20260625082111.47898-1-clamor95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Currently, the driver's binding exposes only one endpoint, which maps to the IFP subdevice's SOURCE pad. This configuration causes failures for many devices using this camera because both the DT binding and the one-to-one pad mapping logic map the endpoint to the wrong pad. Fix this by implementing the get_fwnode_pad operation for the IFP, which correctly matches the endpoint to the corresponding IFP pad. Signed-off-by: Svyatoslav Ryhel --- drivers/media/i2c/mt9m114.c | 44 ++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/drivers/media/i2c/mt9m114.c b/drivers/media/i2c/mt9m114.c index e395e2d14e97..16c2582551d3 100644 --- a/drivers/media/i2c/mt9m114.c +++ b/drivers/media/i2c/mt9m114.c @@ -1020,14 +1020,6 @@ static int mt9m114_stop_streaming(struct mt9m114 *sensor) return ret; } -/* ----------------------------------------------------------------------------- - * Common Subdev Operations - */ - -static const struct media_entity_operations mt9m114_entity_ops = { - .link_validate = v4l2_subdev_link_validate, -}; - /* ----------------------------------------------------------------------------- * Pixel Array Control Operations */ @@ -1381,6 +1373,10 @@ static const struct v4l2_subdev_internal_ops mt9m114_pa_internal_ops = { .init_state = mt9m114_pa_init_state, }; +static const struct media_entity_operations mt9m114_pa_entity_ops = { + .link_validate = v4l2_subdev_link_validate, +}; + static int mt9m114_pa_init(struct mt9m114 *sensor) { struct v4l2_ctrl_handler *hdl = &sensor->pa.hdl; @@ -1403,7 +1399,7 @@ static int mt9m114_pa_init(struct mt9m114 *sensor) /* Initialize the media entity. */ sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; - sd->entity.ops = &mt9m114_entity_ops; + sd->entity.ops = &mt9m114_pa_entity_ops; pads[0].flags = MEDIA_PAD_FL_SOURCE; ret = media_entity_pads_init(&sd->entity, 1, pads); if (ret < 0) @@ -2092,6 +2088,29 @@ static int mt9m114_ifp_registered(struct v4l2_subdev *sd) return 0; } +/* + * The IFP has only one fwnode endpoint, which corresponds to the pad + * linked to the PA (PA SINK), while it should be the SOURCE for the + * next media device in the pipe. + */ +static int mt9m114_ifp_get_fwnode_pad(struct media_entity *entity, + struct fwnode_endpoint *endpoint) +{ + struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(entity); + struct mt9m114 *sensor = ifp_to_mt9m114(sd); + struct fwnode_handle *ifp_port = dev_fwnode(&sensor->client->dev); + struct fwnode_handle *ifp_ep; + int ret; + + ifp_ep = fwnode_graph_get_next_endpoint(ifp_port, NULL); + + ret = endpoint->local_fwnode == ifp_ep ? 1 : -ENXIO; + + fwnode_handle_put(ifp_ep); + + return ret; +} + static const struct v4l2_subdev_video_ops mt9m114_ifp_video_ops = { .s_stream = mt9m114_ifp_s_stream, }; @@ -2119,6 +2138,11 @@ static const struct v4l2_subdev_internal_ops mt9m114_ifp_internal_ops = { .unregistered = mt9m114_ifp_unregistered, }; +static const struct media_entity_operations mt9m114_ifp_entity_ops = { + .link_validate = v4l2_subdev_link_validate, + .get_fwnode_pad = mt9m114_ifp_get_fwnode_pad, +}; + static int mt9m114_ifp_init(struct mt9m114 *sensor) { struct v4l2_subdev *sd = &sensor->ifp.sd; @@ -2136,7 +2160,7 @@ static int mt9m114_ifp_init(struct mt9m114 *sensor) /* Initialize the media entity. */ sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_ISP; - sd->entity.ops = &mt9m114_entity_ops; + sd->entity.ops = &mt9m114_ifp_entity_ops; pads[0].flags = MEDIA_PAD_FL_SINK; pads[1].flags = MEDIA_PAD_FL_SOURCE; ret = media_entity_pads_init(&sd->entity, 2, pads); -- 2.51.0