From nobody Wed Oct 8 20:52:50 2025 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 49E0B1FCFEE for ; Wed, 25 Jun 2025 06:48:55 +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=1750834136; cv=none; b=O9rjwHpcQhMNvteL/vOp9xgK2ZMKSoA9vkdCexHXDbnGWkIgfLPBoZFy+WKr9opxiI/s/A3UYPGx76Q5qAcmWOuKq1+sX0gLK+MJqtOarsbGaRuBXoOu182F+ltOmIqpWyNlYsUNGk31f0U5dx8rcZq4Yla/vaJKuwPH/wpxFDU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750834136; c=relaxed/simple; bh=D9tNmt4CZw29EZUUZcqPTZ6E8NGJet4lpsy9/3O0OYE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ErDq8W8SHClYMyuRMnfPIcb5u0xn3Klg9FnTI2Ed59OyjZOz9hfutTsAMYLP2lGOVjuBwfIlj8M4SquTkhDY4NW+lDGwdznubp4BbxKDaj511AFT5opt7xJu6jrt4D5ycAGabX/Vh7BErp+A+R46iK9/CiIsBo1bWdYIUnQF1Ws= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Y9mGVbKO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Y9mGVbKO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 83345C4CEEE; Wed, 25 Jun 2025 06:48:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1750834135; bh=D9tNmt4CZw29EZUUZcqPTZ6E8NGJet4lpsy9/3O0OYE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Y9mGVbKOBF5ejTzcxmGdL/jIBhWDaddNgLrrxBdcYAj+kbrXMsikeXheJEsBsFkh3 7mCkhgIJLoRC/4NKL+3kA6VgpogQoJsFjdf3nABZNYkNDfHseWCCyZX5UmUXN5+86u PPODUqmugza2SQEyBMxiVDcP0Kq1P0uJip7ku0d+cZX3SdlcUBFtq97oTQS/+W2ZSf YsCD0Hyv/oAxvx2peAu/9WXSYDqdf83JUVvVcMlSxJknU9BxAZu5Po8KNvWdxwTfJK leonlHaa9GDLpJjW8oY0CGQOc5byJlqfxOiIVdhWggdD6K7XhwMrJ50WRnmDEgaDLE cKPhDwlpJejpw== From: Maxime Ripard Date: Wed, 25 Jun 2025 08:48:40 +0200 Subject: [PATCH 3/5] drm/panel: panel-simple: Make panel_simple_probe return its panel Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250625-drm-panel-simple-fixes-v1-3-c428494a86b8@kernel.org> References: <20250625-drm-panel-simple-fixes-v1-0-c428494a86b8@kernel.org> In-Reply-To: <20250625-drm-panel-simple-fixes-v1-0-c428494a86b8@kernel.org> To: Neil Armstrong , Jessica Zhang , Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Luca Ceresoli , Anusha Srivatsa , Francesco Dolcini Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5194; i=mripard@kernel.org; h=from:subject:message-id; bh=D9tNmt4CZw29EZUUZcqPTZ6E8NGJet4lpsy9/3O0OYE=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDBnRs08fn73jhuKUKVfN1JSZ8nW1v1qJBZg+ZVxx1PvPn e2GvzMtOqayMAhzMsiKKbI8kQk7vbx9cZWD/cofMHNYmUCGMHBxCsBEOhYz1spcYitfa85zLeC3 oM9ixS3qkdOtUxqsCi80vtyrm+rzvkjknPLD35991ERnMmrduh/yi7HhLL/UBXHuXS6ZmVNq19h N23GZ/zLT6yOPVP5Mmnfj5eQPLg+PSoe37l506re06NXpQvI/AQ== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D In order to fix the regession introduced by commit de04bb0089a9 ("drm/panel/panel-simple: Use the new allocation in place of devm_kzalloc()"), we need to move the panel_desc lookup into the common panel_simple_probe() function. There's two callers for that function, the probe implementations of the platform and MIPI-DSI drivers panel-simple implements. The MIPI-DSI driver's probe will need to access the current panel_desc to initialize properly, which won't be possible anymore if we make that lookup in panel_simple_probe(). However, we can make panel_simple_probe() return the initialized panel_simple structure it allocated, which will contain a pointer to the associated panel_desc in its desc field. This doesn't fix de04bb0089a9 ("drm/panel/panel-simple: Use the new allocation in place of devm_kzalloc()") still, but makes progress towards that goal. Fixes: de04bb0089a9 ("drm/panel/panel-simple: Use the new allocation in pla= ce of devm_kzalloc()") Signed-off-by: Maxime Ripard --- drivers/gpu/drm/panel/panel-simple.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/p= anel-simple.c index 89188e683822f9202ec580c9a294e42083b9704a..e70ee2d4a538caaae673507b93e= 02b444a2e1640 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -565,11 +565,11 @@ static int panel_simple_override_nondefault_lvds_data= mapping(struct device *dev, } =20 return 0; } =20 -static int panel_simple_probe(struct device *dev, const struct panel_desc = *desc) +static struct panel_simple *panel_simple_probe(struct device *dev, const s= truct panel_desc *desc) { struct panel_simple *panel; struct display_timing dt; struct device_node *ddc; int connector_type; @@ -577,37 +577,37 @@ static int panel_simple_probe(struct device *dev, con= st struct panel_desc *desc) int err; =20 panel =3D devm_drm_panel_alloc(dev, struct panel_simple, base, &panel_simple_funcs, desc->connector_type); if (IS_ERR(panel)) - return PTR_ERR(panel); + return ERR_CAST(panel); =20 panel->desc =3D desc; =20 panel->supply =3D devm_regulator_get(dev, "power"); if (IS_ERR(panel->supply)) - return PTR_ERR(panel->supply); + return ERR_CAST(panel->supply); =20 panel->enable_gpio =3D devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_LOW); if (IS_ERR(panel->enable_gpio)) - return dev_err_probe(dev, PTR_ERR(panel->enable_gpio), - "failed to request GPIO\n"); + return dev_err_cast_probe(dev, panel->enable_gpio, + "failed to request GPIO\n"); =20 err =3D of_drm_get_panel_orientation(dev->of_node, &panel->orientation); if (err) { dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err); - return err; + return ERR_PTR(err); } =20 ddc =3D of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0); if (ddc) { panel->ddc =3D of_find_i2c_adapter_by_node(ddc); of_node_put(ddc); =20 if (!panel->ddc) - return -EPROBE_DEFER; + return ERR_PTR(-EPROBE_DEFER); } =20 if (desc =3D=3D &panel_dpi) { /* Handle the generic panel-dpi binding */ desc =3D panel_dpi_probe(dev); @@ -701,20 +701,20 @@ static int panel_simple_probe(struct device *dev, con= st struct panel_desc *desc) goto disable_pm_runtime; } =20 drm_panel_add(&panel->base); =20 - return 0; + return panel; =20 disable_pm_runtime: pm_runtime_dont_use_autosuspend(dev); pm_runtime_disable(dev); free_ddc: if (panel->ddc) put_device(&panel->ddc->dev); =20 - return err; + return ERR_PTR(err); } =20 static void panel_simple_shutdown(struct device *dev) { struct panel_simple *panel =3D dev_get_drvdata(dev); @@ -5375,16 +5375,21 @@ static const struct of_device_id platform_of_match[= ] =3D { MODULE_DEVICE_TABLE(of, platform_of_match); =20 static int panel_simple_platform_probe(struct platform_device *pdev) { const struct panel_desc *desc; + struct panel_simple *panel; =20 desc =3D of_device_get_match_data(&pdev->dev); if (!desc) return -ENODEV; =20 - return panel_simple_probe(&pdev->dev, desc); + panel =3D panel_simple_probe(&pdev->dev, desc); + if (IS_ERR(panel)) + return PTR_ERR(panel); + + return 0; } =20 static void panel_simple_platform_remove(struct platform_device *pdev) { panel_simple_remove(&pdev->dev); @@ -5651,20 +5656,22 @@ static const struct of_device_id dsi_of_match[] =3D= { MODULE_DEVICE_TABLE(of, dsi_of_match); =20 static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi) { const struct panel_desc_dsi *desc; + struct panel_simple *panel; int err; =20 desc =3D of_device_get_match_data(&dsi->dev); if (!desc) return -ENODEV; =20 - err =3D panel_simple_probe(&dsi->dev, &desc->desc); - if (err < 0) - return err; + panel =3D panel_simple_probe(&dsi->dev, &desc->desc); + if (IS_ERR(panel)) + return PTR_ERR(panel); =20 + desc =3D container_of(panel->desc, struct panel_desc_dsi, desc); dsi->mode_flags =3D desc->flags; dsi->format =3D desc->format; dsi->lanes =3D desc->lanes; =20 err =3D mipi_dsi_attach(dsi); --=20 2.49.0