Skip to content

Commit 921c41e

Browse files
committed
drm/panel: panel-simple: Make panel_simple_probe return its panel
In order to fix the regession introduced by commit de04bb0 ("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 de04bb0 ("drm/panel/panel-simple: Use the new allocation in place of devm_kzalloc()") still, but makes progress towards that goal. Fixes: de04bb0 ("drm/panel/panel-simple: Use the new allocation in place of devm_kzalloc()") Reviewed-by: Javier Martinez Canillas <[email protected]> Tested-by: Francesco Dolcini <[email protected]> # Toradex Colibri iMX6 Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Maxime Ripard <[email protected]>
1 parent 073667f commit 921c41e

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

drivers/gpu/drm/panel/panel-simple.c

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ static int panel_simple_override_nondefault_lvds_datamapping(struct device *dev,
567567
return 0;
568568
}
569569

570-
static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
570+
static struct panel_simple *panel_simple_probe(struct device *dev, const struct panel_desc *desc)
571571
{
572572
struct panel_simple *panel;
573573
struct display_timing dt;
@@ -579,24 +579,24 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
579579
panel = devm_drm_panel_alloc(dev, struct panel_simple, base,
580580
&panel_simple_funcs, desc->connector_type);
581581
if (IS_ERR(panel))
582-
return PTR_ERR(panel);
582+
return ERR_CAST(panel);
583583

584584
panel->desc = desc;
585585

586586
panel->supply = devm_regulator_get(dev, "power");
587587
if (IS_ERR(panel->supply))
588-
return PTR_ERR(panel->supply);
588+
return ERR_CAST(panel->supply);
589589

590590
panel->enable_gpio = devm_gpiod_get_optional(dev, "enable",
591591
GPIOD_OUT_LOW);
592592
if (IS_ERR(panel->enable_gpio))
593-
return dev_err_probe(dev, PTR_ERR(panel->enable_gpio),
594-
"failed to request GPIO\n");
593+
return dev_err_cast_probe(dev, panel->enable_gpio,
594+
"failed to request GPIO\n");
595595

596596
err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation);
597597
if (err) {
598598
dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err);
599-
return err;
599+
return ERR_PTR(err);
600600
}
601601

602602
ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0);
@@ -605,7 +605,7 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
605605
of_node_put(ddc);
606606

607607
if (!panel->ddc)
608-
return -EPROBE_DEFER;
608+
return ERR_PTR(-EPROBE_DEFER);
609609
}
610610

611611
if (desc == &panel_dpi) {
@@ -703,7 +703,7 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
703703

704704
drm_panel_add(&panel->base);
705705

706-
return 0;
706+
return panel;
707707

708708
disable_pm_runtime:
709709
pm_runtime_dont_use_autosuspend(dev);
@@ -712,7 +712,7 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
712712
if (panel->ddc)
713713
put_device(&panel->ddc->dev);
714714

715-
return err;
715+
return ERR_PTR(err);
716716
}
717717

718718
static void panel_simple_shutdown(struct device *dev)
@@ -5377,12 +5377,17 @@ MODULE_DEVICE_TABLE(of, platform_of_match);
53775377
static int panel_simple_platform_probe(struct platform_device *pdev)
53785378
{
53795379
const struct panel_desc *desc;
5380+
struct panel_simple *panel;
53805381

53815382
desc = of_device_get_match_data(&pdev->dev);
53825383
if (!desc)
53835384
return -ENODEV;
53845385

5385-
return panel_simple_probe(&pdev->dev, desc);
5386+
panel = panel_simple_probe(&pdev->dev, desc);
5387+
if (IS_ERR(panel))
5388+
return PTR_ERR(panel);
5389+
5390+
return 0;
53865391
}
53875392

53885393
static void panel_simple_platform_remove(struct platform_device *pdev)
@@ -5653,16 +5658,18 @@ MODULE_DEVICE_TABLE(of, dsi_of_match);
56535658
static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
56545659
{
56555660
const struct panel_desc_dsi *desc;
5661+
struct panel_simple *panel;
56565662
int err;
56575663

56585664
desc = of_device_get_match_data(&dsi->dev);
56595665
if (!desc)
56605666
return -ENODEV;
56615667

5662-
err = panel_simple_probe(&dsi->dev, &desc->desc);
5663-
if (err < 0)
5664-
return err;
5668+
panel = panel_simple_probe(&dsi->dev, &desc->desc);
5669+
if (IS_ERR(panel))
5670+
return PTR_ERR(panel);
56655671

5672+
desc = container_of(panel->desc, struct panel_desc_dsi, desc);
56665673
dsi->mode_flags = desc->flags;
56675674
dsi->format = desc->format;
56685675
dsi->lanes = desc->lanes;

0 commit comments

Comments
 (0)