From patchwork Tue Jun 27 13:18:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans de Goede X-Patchwork-Id: 92768 X-Patchwork-Delegate: sakari.ailus@iki.fi Received: from vger.kernel.org ([23.128.96.18]) by www.linuxtv.org with esmtp (Exim 4.92) (envelope-from ) id 1qE8cH-008gHM-59; Tue, 27 Jun 2023 13:20:21 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230203AbjF0NUT (ORCPT + 1 other); Tue, 27 Jun 2023 09:20:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60284 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230268AbjF0NUN (ORCPT ); Tue, 27 Jun 2023 09:20:13 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EA7AE273F for ; Tue, 27 Jun 2023 06:19:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1687871940; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZfaiEKLGZi5gvAY8hqxAew6JdzFBDLT3zFzyHb5ySEQ=; b=E2rQKpz1+iKFylJxrl/Qd6H2TN6+a1FIgjJ4tl3fSRNA1bfnxCYb2wE2/9cK+i1RA27Rxe 2kHiU5tlgOGmFMdF8GHUBq17D7OAQ+q9teu6Ds3RsfaCIckSPQlghN1QyAOVsFr1rFFJlh 97EoRyyKUR61X2Xmdspw0cdMtj+KgCw= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-397-EgNAYFizPPWa6uPa81duCg-1; Tue, 27 Jun 2023 09:18:58 -0400 X-MC-Unique: EgNAYFizPPWa6uPa81duCg-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B4FEB2815E46; Tue, 27 Jun 2023 13:18:57 +0000 (UTC) Received: from shalem.redhat.com (unknown [10.39.194.24]) by smtp.corp.redhat.com (Postfix) with ESMTP id 689D2401061; Tue, 27 Jun 2023 13:18:56 +0000 (UTC) From: Hans de Goede To: Sakari Ailus , Laurent Pinchart , Rui Miguel Silva , Daniel Scally Cc: Hans de Goede , Mauro Carvalho Chehab , Andy Shevchenko , Kate Hsuan , Tommaso Merciai , linux-media@vger.kernel.org Subject: [PATCH v3 16/29] media: ov2680: Add endpoint matching support Date: Tue, 27 Jun 2023 15:18:17 +0200 Message-ID: <20230627131830.54601-17-hdegoede@redhat.com> In-Reply-To: <20230627131830.54601-1-hdegoede@redhat.com> References: <20230627131830.54601-1-hdegoede@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.10 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H5,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-LSpam-Score: -2.5 (--) X-LSpam-Report: No, score=-2.5 required=5.0 tests=BAYES_00=-1.9,DKIMWL_WL_HIGH=0.001,DKIM_SIGNED=0.1,DKIM_VALID=-0.1,DKIM_VALID_AU=-0.1,HEADER_FROM_DIFFERENT_DOMAINS=0.5,MAILING_LIST_MULTI=-1 autolearn=ham autolearn_force=no Add endpoint matching support and defer probe() until the endpoint fwnode is available. This is necessary on ACPI platforms where the bridge code creating the fwnodes may also e.g. set the "clock-frequency" device property and add GPIO mappings. Acked-by: Rui Miguel Silva Signed-off-by: Hans de Goede --- drivers/media/i2c/ov2680.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/drivers/media/i2c/ov2680.c b/drivers/media/i2c/ov2680.c index d4ef34859914..52ae265612fa 100644 --- a/drivers/media/i2c/ov2680.c +++ b/drivers/media/i2c/ov2680.c @@ -103,6 +103,7 @@ struct ov2680_ctrls { struct ov2680_dev { struct device *dev; + struct fwnode_handle *ep_fwnode; struct regmap *regmap; struct v4l2_subdev sd; @@ -638,6 +639,7 @@ static int ov2680_v4l2_register(struct ov2680_dev *sensor) sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE; sensor->pad.flags = MEDIA_PAD_FL_SOURCE; sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; + sensor->sd.fwnode = sensor->ep_fwnode; ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); if (ret < 0) @@ -799,29 +801,39 @@ static int ov2680_probe(struct i2c_client *client) if (IS_ERR(sensor->regmap)) return PTR_ERR(sensor->regmap); + /* + * Sometimes the fwnode graph is initialized by the bridge driver. + * Bridge drivers doing this may also add GPIO mappings, wait for this. + */ + sensor->ep_fwnode = fwnode_graph_get_next_endpoint(dev_fwnode(dev), + NULL); + if (!sensor->ep_fwnode) + return dev_err_probe(dev, -EPROBE_DEFER, + "waiting for fwnode graph endpoint\n"); + + mutex_init(&sensor->lock); + ret = ov2680_parse_dt(sensor); if (ret < 0) - return -EINVAL; + goto err_fwnode_put; ret = ov2680_mode_init(sensor); if (ret < 0) - return ret; + goto err_fwnode_put; ret = ov2680_get_regulators(sensor); if (ret < 0) { dev_err(dev, "failed to get regulators\n"); - return ret; + goto err_fwnode_put; } - mutex_init(&sensor->lock); - /* * Power up and verify the chip now, so that if runtime pm is * disabled the chip is left on and streaming will work. */ ret = ov2680_power_on(sensor); if (ret < 0) - goto lock_destroy; + goto err_fwnode_put; ret = ov2680_check_id(sensor); if (ret < 0) @@ -848,9 +860,10 @@ static int ov2680_probe(struct i2c_client *client) pm_runtime_put_noidle(&client->dev); err_powerdown: ov2680_power_off(sensor); -lock_destroy: +err_fwnode_put: dev_err(dev, "ov2680 init fail: %d\n", ret); mutex_destroy(&sensor->lock); + fwnode_handle_put(sensor->ep_fwnode); return ret; } @@ -864,6 +877,7 @@ static void ov2680_remove(struct i2c_client *client) mutex_destroy(&sensor->lock); media_entity_cleanup(&sensor->sd.entity); v4l2_ctrl_handler_free(&sensor->ctrls.handler); + fwnode_handle_put(sensor->ep_fwnode); /* * Disable runtime PM. In case runtime PM is disabled in the kernel,