Skip to content

Commit 1f50db2

Browse files
lumagrobclark
authored andcommitted
drm/msm/mdp5: move resource allocation to the _probe function
To let the probe function bail early if any of the resources is unavailable, move resource allocattion from kms_init directly to the probe callback. Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com> Reviewed-by: Rob Clark <robdclark@gmail.com> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Patchwork: https://patchwork.freedesktop.org/patch/561630/ Signed-off-by: Rob Clark <robdclark@chromium.org>
1 parent 3c74682 commit 1f50db2

1 file changed

Lines changed: 44 additions & 56 deletions

File tree

drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c

Lines changed: 44 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -554,20 +554,16 @@ static int mdp5_kms_init(struct drm_device *dev)
554554
struct platform_device *pdev;
555555
struct mdp5_kms *mdp5_kms;
556556
struct mdp5_cfg *config;
557-
struct msm_kms *kms;
557+
struct msm_kms *kms = priv->kms;
558558
struct msm_gem_address_space *aspace;
559-
int irq, i, ret;
559+
int i, ret;
560560

561561
ret = mdp5_init(to_platform_device(dev->dev), dev);
562562
if (ret)
563563
return ret;
564564

565-
/* priv->kms would have been populated by the MDP5 driver */
566-
kms = priv->kms;
567-
if (!kms)
568-
return -ENOMEM;
569-
570565
mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
566+
571567
pdev = mdp5_kms->pdev;
572568

573569
ret = mdp_kms_init(&mdp5_kms->base, &kms_funcs);
@@ -576,15 +572,6 @@ static int mdp5_kms_init(struct drm_device *dev)
576572
goto fail;
577573
}
578574

579-
irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
580-
if (!irq) {
581-
ret = -EINVAL;
582-
DRM_DEV_ERROR(&pdev->dev, "failed to get irq\n");
583-
goto fail;
584-
}
585-
586-
kms->irq = irq;
587-
588575
config = mdp5_cfg_get_config(mdp5_kms->cfg);
589576

590577
/* make sure things are off before attaching iommu (bootloader could
@@ -787,60 +774,23 @@ static int interface_init(struct mdp5_kms *mdp5_kms)
787774
static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
788775
{
789776
struct msm_drm_private *priv = dev->dev_private;
790-
struct mdp5_kms *mdp5_kms;
777+
struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms));
791778
struct mdp5_cfg *config;
792779
u32 major, minor;
793780
int ret;
794781

795-
mdp5_kms = devm_kzalloc(&pdev->dev, sizeof(*mdp5_kms), GFP_KERNEL);
796-
if (!mdp5_kms) {
797-
ret = -ENOMEM;
798-
goto fail;
799-
}
800-
801-
spin_lock_init(&mdp5_kms->resource_lock);
802-
803782
mdp5_kms->dev = dev;
804-
mdp5_kms->pdev = pdev;
805783

806784
ret = mdp5_global_obj_init(mdp5_kms);
807785
if (ret)
808786
goto fail;
809787

810-
mdp5_kms->mmio = msm_ioremap(pdev, "mdp_phys");
811-
if (IS_ERR(mdp5_kms->mmio)) {
812-
ret = PTR_ERR(mdp5_kms->mmio);
813-
goto fail;
814-
}
815-
816-
/* mandatory clocks: */
817-
ret = get_clk(pdev, &mdp5_kms->axi_clk, "bus", true);
818-
if (ret)
819-
goto fail;
820-
ret = get_clk(pdev, &mdp5_kms->ahb_clk, "iface", true);
821-
if (ret)
822-
goto fail;
823-
ret = get_clk(pdev, &mdp5_kms->core_clk, "core", true);
824-
if (ret)
825-
goto fail;
826-
ret = get_clk(pdev, &mdp5_kms->vsync_clk, "vsync", true);
827-
if (ret)
828-
goto fail;
829-
830-
/* optional clocks: */
831-
get_clk(pdev, &mdp5_kms->lut_clk, "lut", false);
832-
get_clk(pdev, &mdp5_kms->tbu_clk, "tbu", false);
833-
get_clk(pdev, &mdp5_kms->tbu_rt_clk, "tbu_rt", false);
834-
835788
/* we need to set a default rate before enabling. Set a safe
836789
* rate first, then figure out hw revision, and then set a
837790
* more optimal rate:
838791
*/
839792
clk_set_rate(mdp5_kms->core_clk, 200000000);
840793

841-
/* set uninit-ed kms */
842-
priv->kms = &mdp5_kms->base.base;
843-
844794
pm_runtime_enable(&pdev->dev);
845795
mdp5_kms->rpm_enabled = true;
846796

@@ -931,15 +881,53 @@ static int mdp5_setup_interconnect(struct platform_device *pdev)
931881

932882
static int mdp5_dev_probe(struct platform_device *pdev)
933883
{
934-
int ret;
884+
struct mdp5_kms *mdp5_kms;
885+
int ret, irq;
935886

936887
DBG("");
937888

889+
mdp5_kms = devm_kzalloc(&pdev->dev, sizeof(*mdp5_kms), GFP_KERNEL);
890+
if (!mdp5_kms)
891+
return -ENOMEM;
892+
938893
ret = mdp5_setup_interconnect(pdev);
939894
if (ret)
940895
return ret;
941896

942-
return msm_drv_probe(&pdev->dev, mdp5_kms_init, NULL);
897+
mdp5_kms->pdev = pdev;
898+
899+
spin_lock_init(&mdp5_kms->resource_lock);
900+
901+
mdp5_kms->mmio = msm_ioremap(pdev, "mdp_phys");
902+
if (IS_ERR(mdp5_kms->mmio))
903+
return PTR_ERR(mdp5_kms->mmio);
904+
905+
/* mandatory clocks: */
906+
ret = get_clk(pdev, &mdp5_kms->axi_clk, "bus", true);
907+
if (ret)
908+
return ret;
909+
ret = get_clk(pdev, &mdp5_kms->ahb_clk, "iface", true);
910+
if (ret)
911+
return ret;
912+
ret = get_clk(pdev, &mdp5_kms->core_clk, "core", true);
913+
if (ret)
914+
return ret;
915+
ret = get_clk(pdev, &mdp5_kms->vsync_clk, "vsync", true);
916+
if (ret)
917+
return ret;
918+
919+
/* optional clocks: */
920+
get_clk(pdev, &mdp5_kms->lut_clk, "lut", false);
921+
get_clk(pdev, &mdp5_kms->tbu_clk, "tbu", false);
922+
get_clk(pdev, &mdp5_kms->tbu_rt_clk, "tbu_rt", false);
923+
924+
irq = platform_get_irq(pdev, 0);
925+
if (irq < 0)
926+
return dev_err_probe(&pdev->dev, irq, "failed to get irq\n");
927+
928+
mdp5_kms->base.base.irq = irq;
929+
930+
return msm_drv_probe(&pdev->dev, mdp5_kms_init, &mdp5_kms->base.base);
943931
}
944932

945933
static int mdp5_dev_remove(struct platform_device *pdev)

0 commit comments

Comments
 (0)