aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/dss
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2018-03-02 15:13:06 -0500
committerTomi Valkeinen <tomi.valkeinen@ti.com>2018-09-03 09:13:27 -0400
commit27d624527d99265c2df999af3615ff71c29d06f4 (patch)
tree7dc6bf622bfde27e4a25482aa0b80e8c902a630f /drivers/gpu/drm/omapdrm/dss
parentc87193267d247c58f4517081d9cd04c8dc6302b8 (diff)
drm/omap: dss: Acquire next dssdev at probe time
Look up the next dssdev at probe time based on device tree links for all DSS outputs and encoders. This will be used to reverse the order of the dssdev connect and disconnect call chains. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/dss')
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dpi.c17
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dsi.c18
-rw-r--r--drivers/gpu/drm/omapdrm/dss/hdmi4.c18
-rw-r--r--drivers/gpu/drm/omapdrm/dss/hdmi5.c18
-rw-r--r--drivers/gpu/drm/omapdrm/dss/omapdss.h1
-rw-r--r--drivers/gpu/drm/omapdrm/dss/sdi.c17
-rw-r--r--drivers/gpu/drm/omapdrm/dss/venc.c18
7 files changed, 93 insertions, 14 deletions
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
index 5839009f272e..ae35aa1bf2c5 100644
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
@@ -688,7 +688,7 @@ static const struct omap_dss_device_ops dpi_ops = {
688 .set_timings = dpi_set_timings, 688 .set_timings = dpi_set_timings,
689}; 689};
690 690
691static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port) 691static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
692{ 692{
693 struct omap_dss_device *out = &dpi->output; 693 struct omap_dss_device *out = &dpi->output;
694 u32 port_num = 0; 694 u32 port_num = 0;
@@ -717,7 +717,16 @@ static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
717 out->ops = &dpi_ops; 717 out->ops = &dpi_ops;
718 out->owner = THIS_MODULE; 718 out->owner = THIS_MODULE;
719 719
720 out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
721 if (IS_ERR(out->next)) {
722 if (PTR_ERR(out->next) != -EPROBE_DEFER)
723 dev_err(out->dev, "failed to find video sink\n");
724 return PTR_ERR(out->next);
725 }
726
720 omapdss_device_register(out); 727 omapdss_device_register(out);
728
729 return 0;
721} 730}
722 731
723static void dpi_uninit_output_port(struct device_node *port) 732static void dpi_uninit_output_port(struct device_node *port)
@@ -725,6 +734,8 @@ static void dpi_uninit_output_port(struct device_node *port)
725 struct dpi_data *dpi = port->data; 734 struct dpi_data *dpi = port->data;
726 struct omap_dss_device *out = &dpi->output; 735 struct omap_dss_device *out = &dpi->output;
727 736
737 if (out->next)
738 omapdss_device_put(out->next);
728 omapdss_device_unregister(out); 739 omapdss_device_unregister(out);
729} 740}
730 741
@@ -760,9 +771,7 @@ int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
760 771
761 mutex_init(&dpi->lock); 772 mutex_init(&dpi->lock);
762 773
763 dpi_init_output_port(dpi, port); 774 return dpi_init_output_port(dpi, port);
764
765 return 0;
766} 775}
767 776
768void dpi_uninit_port(struct device_node *port) 777void dpi_uninit_port(struct device_node *port)
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index ab0426fab22e..631bf5805649 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -5165,7 +5165,7 @@ static const struct component_ops dsi_component_ops = {
5165 * Probe & Remove, Suspend & Resume 5165 * Probe & Remove, Suspend & Resume
5166 */ 5166 */
5167 5167
5168static void dsi_init_output(struct dsi_data *dsi) 5168static int dsi_init_output(struct dsi_data *dsi)
5169{ 5169{
5170 struct omap_dss_device *out = &dsi->output; 5170 struct omap_dss_device *out = &dsi->output;
5171 5171
@@ -5180,13 +5180,24 @@ static void dsi_init_output(struct dsi_data *dsi)
5180 out->owner = THIS_MODULE; 5180 out->owner = THIS_MODULE;
5181 out->of_ports = BIT(0); 5181 out->of_ports = BIT(0);
5182 5182
5183 out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
5184 if (IS_ERR(out->next)) {
5185 if (PTR_ERR(out->next) != -EPROBE_DEFER)
5186 dev_err(out->dev, "failed to find video sink\n");
5187 return PTR_ERR(out->next);
5188 }
5189
5183 omapdss_device_register(out); 5190 omapdss_device_register(out);
5191
5192 return 0;
5184} 5193}
5185 5194
5186static void dsi_uninit_output(struct dsi_data *dsi) 5195static void dsi_uninit_output(struct dsi_data *dsi)
5187{ 5196{
5188 struct omap_dss_device *out = &dsi->output; 5197 struct omap_dss_device *out = &dsi->output;
5189 5198
5199 if (out->next)
5200 omapdss_device_put(out->next);
5190 omapdss_device_unregister(out); 5201 omapdss_device_unregister(out);
5191} 5202}
5192 5203
@@ -5431,7 +5442,9 @@ static int dsi_probe(struct platform_device *pdev)
5431 else 5442 else
5432 dsi->num_lanes_supported = 3; 5443 dsi->num_lanes_supported = 3;
5433 5444
5434 dsi_init_output(dsi); 5445 r = dsi_init_output(dsi);
5446 if (r)
5447 goto err_pm_disable;
5435 5448
5436 r = dsi_probe_of(dsi); 5449 r = dsi_probe_of(dsi);
5437 if (r) { 5450 if (r) {
@@ -5451,6 +5464,7 @@ static int dsi_probe(struct platform_device *pdev)
5451 5464
5452err_uninit_output: 5465err_uninit_output:
5453 dsi_uninit_output(dsi); 5466 dsi_uninit_output(dsi);
5467err_pm_disable:
5454 pm_runtime_disable(dev); 5468 pm_runtime_disable(dev);
5455 return r; 5469 return r;
5456} 5470}
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index 89fdce02278c..118c015624b9 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -731,7 +731,7 @@ static const struct component_ops hdmi4_component_ops = {
731 * Probe & Remove, Suspend & Resume 731 * Probe & Remove, Suspend & Resume
732 */ 732 */
733 733
734static void hdmi4_init_output(struct omap_hdmi *hdmi) 734static int hdmi4_init_output(struct omap_hdmi *hdmi)
735{ 735{
736 struct omap_dss_device *out = &hdmi->output; 736 struct omap_dss_device *out = &hdmi->output;
737 737
@@ -744,13 +744,24 @@ static void hdmi4_init_output(struct omap_hdmi *hdmi)
744 out->owner = THIS_MODULE; 744 out->owner = THIS_MODULE;
745 out->of_ports = BIT(0); 745 out->of_ports = BIT(0);
746 746
747 out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
748 if (IS_ERR(out->next)) {
749 if (PTR_ERR(out->next) != -EPROBE_DEFER)
750 dev_err(out->dev, "failed to find video sink\n");
751 return PTR_ERR(out->next);
752 }
753
747 omapdss_device_register(out); 754 omapdss_device_register(out);
755
756 return 0;
748} 757}
749 758
750static void hdmi4_uninit_output(struct omap_hdmi *hdmi) 759static void hdmi4_uninit_output(struct omap_hdmi *hdmi)
751{ 760{
752 struct omap_dss_device *out = &hdmi->output; 761 struct omap_dss_device *out = &hdmi->output;
753 762
763 if (out->next)
764 omapdss_device_put(out->next);
754 omapdss_device_unregister(out); 765 omapdss_device_unregister(out);
755} 766}
756 767
@@ -820,7 +831,9 @@ static int hdmi4_probe(struct platform_device *pdev)
820 831
821 pm_runtime_enable(&pdev->dev); 832 pm_runtime_enable(&pdev->dev);
822 833
823 hdmi4_init_output(hdmi); 834 r = hdmi4_init_output(hdmi);
835 if (r)
836 goto err_pm_disable;
824 837
825 r = component_add(&pdev->dev, &hdmi4_component_ops); 838 r = component_add(&pdev->dev, &hdmi4_component_ops);
826 if (r) 839 if (r)
@@ -830,6 +843,7 @@ static int hdmi4_probe(struct platform_device *pdev)
830 843
831err_uninit_output: 844err_uninit_output:
832 hdmi4_uninit_output(hdmi); 845 hdmi4_uninit_output(hdmi);
846err_pm_disable:
833 pm_runtime_disable(&pdev->dev); 847 pm_runtime_disable(&pdev->dev);
834err_free: 848err_free:
835 kfree(hdmi); 849 kfree(hdmi);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 64b45a612439..7af60ca4e7b2 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -721,7 +721,7 @@ static const struct component_ops hdmi5_component_ops = {
721 * Probe & Remove, Suspend & Resume 721 * Probe & Remove, Suspend & Resume
722 */ 722 */
723 723
724static void hdmi5_init_output(struct omap_hdmi *hdmi) 724static int hdmi5_init_output(struct omap_hdmi *hdmi)
725{ 725{
726 struct omap_dss_device *out = &hdmi->output; 726 struct omap_dss_device *out = &hdmi->output;
727 727
@@ -734,13 +734,24 @@ static void hdmi5_init_output(struct omap_hdmi *hdmi)
734 out->owner = THIS_MODULE; 734 out->owner = THIS_MODULE;
735 out->of_ports = BIT(0); 735 out->of_ports = BIT(0);
736 736
737 out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
738 if (IS_ERR(out->next)) {
739 if (PTR_ERR(out->next) != -EPROBE_DEFER)
740 dev_err(out->dev, "failed to find video sink\n");
741 return PTR_ERR(out->next);
742 }
743
737 omapdss_device_register(out); 744 omapdss_device_register(out);
745
746 return 0;
738} 747}
739 748
740static void hdmi5_uninit_output(struct omap_hdmi *hdmi) 749static void hdmi5_uninit_output(struct omap_hdmi *hdmi)
741{ 750{
742 struct omap_dss_device *out = &hdmi->output; 751 struct omap_dss_device *out = &hdmi->output;
743 752
753 if (out->next)
754 omapdss_device_put(out->next);
744 omapdss_device_unregister(out); 755 omapdss_device_unregister(out);
745} 756}
746 757
@@ -810,7 +821,9 @@ static int hdmi5_probe(struct platform_device *pdev)
810 821
811 pm_runtime_enable(&pdev->dev); 822 pm_runtime_enable(&pdev->dev);
812 823
813 hdmi5_init_output(hdmi); 824 r = hdmi5_init_output(hdmi);
825 if (r)
826 goto err_pm_disable;
814 827
815 r = component_add(&pdev->dev, &hdmi5_component_ops); 828 r = component_add(&pdev->dev, &hdmi5_component_ops);
816 if (r) 829 if (r)
@@ -820,6 +833,7 @@ static int hdmi5_probe(struct platform_device *pdev)
820 833
821err_uninit_output: 834err_uninit_output:
822 hdmi5_uninit_output(hdmi); 835 hdmi5_uninit_output(hdmi);
836err_pm_disable:
823 pm_runtime_disable(&pdev->dev); 837 pm_runtime_disable(&pdev->dev);
824err_free: 838err_free:
825 kfree(hdmi); 839 kfree(hdmi);
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index dc2f8167f61b..5d3e4ced73d1 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -394,6 +394,7 @@ struct omap_dss_device {
394 struct dss_device *dss; 394 struct dss_device *dss;
395 struct omap_dss_device *src; 395 struct omap_dss_device *src;
396 struct omap_dss_device *dst; 396 struct omap_dss_device *dst;
397 struct omap_dss_device *next;
397 398
398 struct list_head list; 399 struct list_head list;
399 400
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
index e9b280784264..fd7c11ebda5d 100644
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
@@ -317,7 +317,7 @@ static const struct omap_dss_device_ops sdi_ops = {
317 .set_timings = sdi_set_timings, 317 .set_timings = sdi_set_timings,
318}; 318};
319 319
320static void sdi_init_output(struct sdi_device *sdi) 320static int sdi_init_output(struct sdi_device *sdi)
321{ 321{
322 struct omap_dss_device *out = &sdi->output; 322 struct omap_dss_device *out = &sdi->output;
323 323
@@ -331,11 +331,22 @@ static void sdi_init_output(struct sdi_device *sdi)
331 out->ops = &sdi_ops; 331 out->ops = &sdi_ops;
332 out->owner = THIS_MODULE; 332 out->owner = THIS_MODULE;
333 333
334 out->next = omapdss_of_find_connected_device(out->dev->of_node, 1);
335 if (IS_ERR(out->next)) {
336 if (PTR_ERR(out->next) != -EPROBE_DEFER)
337 dev_err(out->dev, "failed to find video sink\n");
338 return PTR_ERR(out->next);
339 }
340
334 omapdss_device_register(out); 341 omapdss_device_register(out);
342
343 return 0;
335} 344}
336 345
337static void sdi_uninit_output(struct sdi_device *sdi) 346static void sdi_uninit_output(struct sdi_device *sdi)
338{ 347{
348 if (sdi->output.next)
349 omapdss_device_put(sdi->output.next);
339 omapdss_device_unregister(&sdi->output); 350 omapdss_device_unregister(&sdi->output);
340} 351}
341 352
@@ -370,7 +381,9 @@ int sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
370 sdi->pdev = pdev; 381 sdi->pdev = pdev;
371 port->data = sdi; 382 port->data = sdi;
372 383
373 sdi_init_output(sdi); 384 r = sdi_init_output(sdi);
385 if (r)
386 goto err_free;
374 387
375 return 0; 388 return 0;
376 389
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 5adf8510d67b..298e86cc9e14 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -800,7 +800,7 @@ static const struct component_ops venc_component_ops = {
800 * Probe & Remove, Suspend & Resume 800 * Probe & Remove, Suspend & Resume
801 */ 801 */
802 802
803static void venc_init_output(struct venc_device *venc) 803static int venc_init_output(struct venc_device *venc)
804{ 804{
805 struct omap_dss_device *out = &venc->output; 805 struct omap_dss_device *out = &venc->output;
806 806
@@ -813,11 +813,22 @@ static void venc_init_output(struct venc_device *venc)
813 out->owner = THIS_MODULE; 813 out->owner = THIS_MODULE;
814 out->of_ports = BIT(0); 814 out->of_ports = BIT(0);
815 815
816 out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
817 if (IS_ERR(out->next)) {
818 if (PTR_ERR(out->next) != -EPROBE_DEFER)
819 dev_err(out->dev, "failed to find video sink\n");
820 return PTR_ERR(out->next);
821 }
822
816 omapdss_device_register(out); 823 omapdss_device_register(out);
824
825 return 0;
817} 826}
818 827
819static void venc_uninit_output(struct venc_device *venc) 828static void venc_uninit_output(struct venc_device *venc)
820{ 829{
830 if (venc->output.next)
831 omapdss_device_put(venc->output.next);
821 omapdss_device_unregister(&venc->output); 832 omapdss_device_unregister(&venc->output);
822} 833}
823 834
@@ -909,7 +920,9 @@ static int venc_probe(struct platform_device *pdev)
909 920
910 pm_runtime_enable(&pdev->dev); 921 pm_runtime_enable(&pdev->dev);
911 922
912 venc_init_output(venc); 923 r = venc_init_output(venc);
924 if (r)
925 goto err_pm_disable;
913 926
914 r = component_add(&pdev->dev, &venc_component_ops); 927 r = component_add(&pdev->dev, &venc_component_ops);
915 if (r) 928 if (r)
@@ -919,6 +932,7 @@ static int venc_probe(struct platform_device *pdev)
919 932
920err_uninit_output: 933err_uninit_output:
921 venc_uninit_output(venc); 934 venc_uninit_output(venc);
935err_pm_disable:
922 pm_runtime_disable(&pdev->dev); 936 pm_runtime_disable(&pdev->dev);
923err_free: 937err_free:
924 kfree(venc); 938 kfree(venc);