aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video
diff options
context:
space:
mode:
authorArchit Taneja <archit@ti.com>2012-09-26 07:00:49 -0400
committerArchit Taneja <archit@ti.com>2012-09-26 07:00:49 -0400
commit81b87f515f6abbbe4eef42835065db9d0831ef35 (patch)
tree3eebf0e10cd70425bb80c60202236f8a2ce96a38 /drivers/video
parent484dc404d233696ef65a8e676f9d4fe563b091ee (diff)
OMAPDSS: outputs: Create and register output instances
Add output structs to output driver's private data. Register output instances by having an init function in the probes of the platform device drivers for different outputs. The *_init_output for each output registers the output and fill up the output's plaform device, type and id fields. The *_uninit_output functions unregister the output. In the probe of each interface driver, the output entities are initialized before the *_probe_pdata() functions intentionally. This is done to ensure that the output entity is prepared before the panels connected to the output are registered. We need the output entities to be ready because OMAPDSS will try to make connections between overlays, managers, outputs and devices during the panel's probe. Signed-off-by: Archit Taneja <archit@ti.com>
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/omap2/dss/dpi.c24
-rw-r--r--drivers/video/omap2/dss/dsi.c28
-rw-r--r--drivers/video/omap2/dss/hdmi.c24
-rw-r--r--drivers/video/omap2/dss/rfbi.c26
-rw-r--r--drivers/video/omap2/dss/sdi.c24
-rw-r--r--drivers/video/omap2/dss/venc.c24
6 files changed, 150 insertions, 0 deletions
diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
index f6800e19bbcb..ee1fa1e1a015 100644
--- a/drivers/video/omap2/dss/dpi.c
+++ b/drivers/video/omap2/dss/dpi.c
@@ -44,6 +44,8 @@ static struct {
44 struct omap_video_timings timings; 44 struct omap_video_timings timings;
45 struct dss_lcd_mgr_config mgr_config; 45 struct dss_lcd_mgr_config mgr_config;
46 int data_lines; 46 int data_lines;
47
48 struct omap_dss_output output;
47} dpi; 49} dpi;
48 50
49static struct platform_device *dpi_get_dsidev(enum omap_dss_clk_source clk) 51static struct platform_device *dpi_get_dsidev(enum omap_dss_clk_source clk)
@@ -436,10 +438,30 @@ static void __init dpi_probe_pdata(struct platform_device *dpidev)
436 } 438 }
437} 439}
438 440
441static void __init dpi_init_output(struct platform_device *pdev)
442{
443 struct omap_dss_output *out = &dpi.output;
444
445 out->pdev = pdev;
446 out->id = OMAP_DSS_OUTPUT_DPI;
447 out->type = OMAP_DISPLAY_TYPE_DPI;
448
449 dss_register_output(out);
450}
451
452static void __exit dpi_uninit_output(struct platform_device *pdev)
453{
454 struct omap_dss_output *out = &dpi.output;
455
456 dss_unregister_output(out);
457}
458
439static int __init omap_dpi_probe(struct platform_device *pdev) 459static int __init omap_dpi_probe(struct platform_device *pdev)
440{ 460{
441 mutex_init(&dpi.lock); 461 mutex_init(&dpi.lock);
442 462
463 dpi_init_output(pdev);
464
443 dpi_probe_pdata(pdev); 465 dpi_probe_pdata(pdev);
444 466
445 return 0; 467 return 0;
@@ -449,6 +471,8 @@ static int __exit omap_dpi_remove(struct platform_device *pdev)
449{ 471{
450 dss_unregister_child_devices(&pdev->dev); 472 dss_unregister_child_devices(&pdev->dev);
451 473
474 dpi_uninit_output(pdev);
475
452 return 0; 476 return 0;
453} 477}
454 478
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
index 5c82c918d2e3..55748bc081e8 100644
--- a/drivers/video/omap2/dss/dsi.c
+++ b/drivers/video/omap2/dss/dsi.c
@@ -336,6 +336,8 @@ struct dsi_data {
336 enum omap_dss_dsi_pixel_format pix_fmt; 336 enum omap_dss_dsi_pixel_format pix_fmt;
337 enum omap_dss_dsi_mode mode; 337 enum omap_dss_dsi_mode mode;
338 struct omap_dss_dsi_videomode_timings vm_timings; 338 struct omap_dss_dsi_videomode_timings vm_timings;
339
340 struct omap_dss_output output;
339}; 341};
340 342
341struct dsi_packet_sent_handler_data { 343struct dsi_packet_sent_handler_data {
@@ -5156,6 +5158,28 @@ static void __init dsi_probe_pdata(struct platform_device *dsidev)
5156 } 5158 }
5157} 5159}
5158 5160
5161static void __init dsi_init_output(struct platform_device *dsidev)
5162{
5163 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
5164 struct omap_dss_output *out = &dsi->output;
5165
5166 out->pdev = dsidev;
5167 out->id = dsi->module_id == 0 ?
5168 OMAP_DSS_OUTPUT_DSI1 : OMAP_DSS_OUTPUT_DSI2;
5169
5170 out->type = OMAP_DISPLAY_TYPE_DSI;
5171
5172 dss_register_output(out);
5173}
5174
5175static void __exit dsi_uninit_output(struct platform_device *dsidev)
5176{
5177 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
5178 struct omap_dss_output *out = &dsi->output;
5179
5180 dss_unregister_output(out);
5181}
5182
5159/* DSI1 HW IP initialisation */ 5183/* DSI1 HW IP initialisation */
5160static int __init omap_dsihw_probe(struct platform_device *dsidev) 5184static int __init omap_dsihw_probe(struct platform_device *dsidev)
5161{ 5185{
@@ -5250,6 +5274,8 @@ static int __init omap_dsihw_probe(struct platform_device *dsidev)
5250 else 5274 else
5251 dsi->num_lanes_supported = 3; 5275 dsi->num_lanes_supported = 3;
5252 5276
5277 dsi_init_output(dsidev);
5278
5253 dsi_probe_pdata(dsidev); 5279 dsi_probe_pdata(dsidev);
5254 5280
5255 dsi_runtime_put(dsidev); 5281 dsi_runtime_put(dsidev);
@@ -5281,6 +5307,8 @@ static int __exit omap_dsihw_remove(struct platform_device *dsidev)
5281 5307
5282 dss_unregister_child_devices(&dsidev->dev); 5308 dss_unregister_child_devices(&dsidev->dev);
5283 5309
5310 dsi_uninit_output(dsidev);
5311
5284 pm_runtime_disable(&dsidev->dev); 5312 pm_runtime_disable(&dsidev->dev);
5285 5313
5286 dsi_put_clocks(dsidev); 5314 dsi_put_clocks(dsidev);
diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c
index 23daf7dcf54a..294bf9879434 100644
--- a/drivers/video/omap2/dss/hdmi.c
+++ b/drivers/video/omap2/dss/hdmi.c
@@ -68,6 +68,8 @@ static struct {
68 int ct_cp_hpd_gpio; 68 int ct_cp_hpd_gpio;
69 int ls_oe_gpio; 69 int ls_oe_gpio;
70 int hpd_gpio; 70 int hpd_gpio;
71
72 struct omap_dss_output output;
71} hdmi; 73} hdmi;
72 74
73/* 75/*
@@ -970,6 +972,24 @@ static void __init hdmi_probe_pdata(struct platform_device *pdev)
970 } 972 }
971} 973}
972 974
975static void __init hdmi_init_output(struct platform_device *pdev)
976{
977 struct omap_dss_output *out = &hdmi.output;
978
979 out->pdev = pdev;
980 out->id = OMAP_DSS_OUTPUT_HDMI;
981 out->type = OMAP_DISPLAY_TYPE_HDMI;
982
983 dss_register_output(out);
984}
985
986static void __exit hdmi_uninit_output(struct platform_device *pdev)
987{
988 struct omap_dss_output *out = &hdmi.output;
989
990 dss_unregister_output(out);
991}
992
973/* HDMI HW IP initialisation */ 993/* HDMI HW IP initialisation */
974static int __init omapdss_hdmihw_probe(struct platform_device *pdev) 994static int __init omapdss_hdmihw_probe(struct platform_device *pdev)
975{ 995{
@@ -1013,6 +1033,8 @@ static int __init omapdss_hdmihw_probe(struct platform_device *pdev)
1013 1033
1014 dss_debugfs_create_file("hdmi", hdmi_dump_regs); 1034 dss_debugfs_create_file("hdmi", hdmi_dump_regs);
1015 1035
1036 hdmi_init_output(pdev);
1037
1016 hdmi_probe_pdata(pdev); 1038 hdmi_probe_pdata(pdev);
1017 1039
1018 return 0; 1040 return 0;
@@ -1033,6 +1055,8 @@ static int __exit omapdss_hdmihw_remove(struct platform_device *pdev)
1033 1055
1034 hdmi_panel_exit(); 1056 hdmi_panel_exit();
1035 1057
1058 hdmi_uninit_output(pdev);
1059
1036 pm_runtime_disable(&pdev->dev); 1060 pm_runtime_disable(&pdev->dev);
1037 1061
1038 hdmi_put_clocks(); 1062 hdmi_put_clocks();
diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c
index 38d9b8ecbe3c..58e51722fccf 100644
--- a/drivers/video/omap2/dss/rfbi.c
+++ b/drivers/video/omap2/dss/rfbi.c
@@ -116,6 +116,8 @@ static struct {
116 int pixel_size; 116 int pixel_size;
117 int data_lines; 117 int data_lines;
118 struct rfbi_timings intf_timings; 118 struct rfbi_timings intf_timings;
119
120 struct omap_dss_output output;
119} rfbi; 121} rfbi;
120 122
121static inline void rfbi_write_reg(const struct rfbi_reg idx, u32 val) 123static inline void rfbi_write_reg(const struct rfbi_reg idx, u32 val)
@@ -1002,6 +1004,24 @@ static void __init rfbi_probe_pdata(struct platform_device *rfbidev)
1002 } 1004 }
1003} 1005}
1004 1006
1007static void __init rfbi_init_output(struct platform_device *pdev)
1008{
1009 struct omap_dss_output *out = &rfbi.output;
1010
1011 out->pdev = pdev;
1012 out->id = OMAP_DSS_OUTPUT_DBI;
1013 out->type = OMAP_DISPLAY_TYPE_DBI;
1014
1015 dss_register_output(out);
1016}
1017
1018static void __exit rfbi_uninit_output(struct platform_device *pdev)
1019{
1020 struct omap_dss_output *out = &rfbi.output;
1021
1022 dss_unregister_output(out);
1023}
1024
1005/* RFBI HW IP initialisation */ 1025/* RFBI HW IP initialisation */
1006static int __init omap_rfbihw_probe(struct platform_device *pdev) 1026static int __init omap_rfbihw_probe(struct platform_device *pdev)
1007{ 1027{
@@ -1053,6 +1073,8 @@ static int __init omap_rfbihw_probe(struct platform_device *pdev)
1053 1073
1054 dss_debugfs_create_file("rfbi", rfbi_dump_regs); 1074 dss_debugfs_create_file("rfbi", rfbi_dump_regs);
1055 1075
1076 rfbi_init_output(pdev);
1077
1056 rfbi_probe_pdata(pdev); 1078 rfbi_probe_pdata(pdev);
1057 1079
1058 return 0; 1080 return 0;
@@ -1065,7 +1087,11 @@ err_runtime_get:
1065static int __exit omap_rfbihw_remove(struct platform_device *pdev) 1087static int __exit omap_rfbihw_remove(struct platform_device *pdev)
1066{ 1088{
1067 dss_unregister_child_devices(&pdev->dev); 1089 dss_unregister_child_devices(&pdev->dev);
1090
1091 rfbi_uninit_output(pdev);
1092
1068 pm_runtime_disable(&pdev->dev); 1093 pm_runtime_disable(&pdev->dev);
1094
1069 return 0; 1095 return 0;
1070} 1096}
1071 1097
diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c
index 919ff728c502..47f9fe4e1741 100644
--- a/drivers/video/omap2/dss/sdi.c
+++ b/drivers/video/omap2/dss/sdi.c
@@ -36,6 +36,8 @@ static struct {
36 struct dss_lcd_mgr_config mgr_config; 36 struct dss_lcd_mgr_config mgr_config;
37 struct omap_video_timings timings; 37 struct omap_video_timings timings;
38 int datapairs; 38 int datapairs;
39
40 struct omap_dss_output output;
39} sdi; 41} sdi;
40 42
41static void sdi_config_lcd_manager(struct omap_dss_device *dssdev) 43static void sdi_config_lcd_manager(struct omap_dss_device *dssdev)
@@ -255,8 +257,28 @@ static void __init sdi_probe_pdata(struct platform_device *sdidev)
255 } 257 }
256} 258}
257 259
260static void __init sdi_init_output(struct platform_device *pdev)
261{
262 struct omap_dss_output *out = &sdi.output;
263
264 out->pdev = pdev;
265 out->id = OMAP_DSS_OUTPUT_SDI;
266 out->type = OMAP_DISPLAY_TYPE_SDI;
267
268 dss_register_output(out);
269}
270
271static void __exit sdi_uninit_output(struct platform_device *pdev)
272{
273 struct omap_dss_output *out = &sdi.output;
274
275 dss_unregister_output(out);
276}
277
258static int __init omap_sdi_probe(struct platform_device *pdev) 278static int __init omap_sdi_probe(struct platform_device *pdev)
259{ 279{
280 sdi_init_output(pdev);
281
260 sdi_probe_pdata(pdev); 282 sdi_probe_pdata(pdev);
261 283
262 return 0; 284 return 0;
@@ -266,6 +288,8 @@ static int __exit omap_sdi_remove(struct platform_device *pdev)
266{ 288{
267 dss_unregister_child_devices(&pdev->dev); 289 dss_unregister_child_devices(&pdev->dev);
268 290
291 sdi_uninit_output(pdev);
292
269 return 0; 293 return 0;
270} 294}
271 295
diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
index 996779c0204c..24d278b3e7fd 100644
--- a/drivers/video/omap2/dss/venc.c
+++ b/drivers/video/omap2/dss/venc.c
@@ -303,6 +303,8 @@ static struct {
303 struct omap_video_timings timings; 303 struct omap_video_timings timings;
304 enum omap_dss_venc_type type; 304 enum omap_dss_venc_type type;
305 bool invert_polarity; 305 bool invert_polarity;
306
307 struct omap_dss_output output;
306} venc; 308} venc;
307 309
308static inline void venc_write_reg(int idx, u32 val) 310static inline void venc_write_reg(int idx, u32 val)
@@ -797,6 +799,24 @@ static void __init venc_probe_pdata(struct platform_device *vencdev)
797 } 799 }
798} 800}
799 801
802static void __init venc_init_output(struct platform_device *pdev)
803{
804 struct omap_dss_output *out = &venc.output;
805
806 out->pdev = pdev;
807 out->id = OMAP_DSS_OUTPUT_VENC;
808 out->type = OMAP_DISPLAY_TYPE_VENC;
809
810 dss_register_output(out);
811}
812
813static void __exit venc_uninit_output(struct platform_device *pdev)
814{
815 struct omap_dss_output *out = &venc.output;
816
817 dss_unregister_output(out);
818}
819
800/* VENC HW IP initialisation */ 820/* VENC HW IP initialisation */
801static int __init omap_venchw_probe(struct platform_device *pdev) 821static int __init omap_venchw_probe(struct platform_device *pdev)
802{ 822{
@@ -844,6 +864,8 @@ static int __init omap_venchw_probe(struct platform_device *pdev)
844 864
845 dss_debugfs_create_file("venc", venc_dump_regs); 865 dss_debugfs_create_file("venc", venc_dump_regs);
846 866
867 venc_init_output(pdev);
868
847 venc_probe_pdata(pdev); 869 venc_probe_pdata(pdev);
848 870
849 return 0; 871 return 0;
@@ -866,6 +888,8 @@ static int __exit omap_venchw_remove(struct platform_device *pdev)
866 888
867 venc_panel_exit(); 889 venc_panel_exit();
868 890
891 venc_uninit_output(pdev);
892
869 pm_runtime_disable(&pdev->dev); 893 pm_runtime_disable(&pdev->dev);
870 venc_put_clocks(); 894 venc_put_clocks();
871 895