diff options
Diffstat (limited to 'drivers/video/omap2/dss/dss.c')
-rw-r--r-- | drivers/video/omap2/dss/dss.c | 65 |
1 files changed, 34 insertions, 31 deletions
diff --git a/drivers/video/omap2/dss/dss.c b/drivers/video/omap2/dss/dss.c index bd2d5e159463..6ea1ff149f6f 100644 --- a/drivers/video/omap2/dss/dss.c +++ b/drivers/video/omap2/dss/dss.c | |||
@@ -62,6 +62,9 @@ struct dss_reg { | |||
62 | #define REG_FLD_MOD(idx, val, start, end) \ | 62 | #define REG_FLD_MOD(idx, val, start, end) \ |
63 | dss_write_reg(idx, FLD_MOD(dss_read_reg(idx), val, start, end)) | 63 | dss_write_reg(idx, FLD_MOD(dss_read_reg(idx), val, start, end)) |
64 | 64 | ||
65 | static int dss_runtime_get(void); | ||
66 | static void dss_runtime_put(void); | ||
67 | |||
65 | static struct { | 68 | static struct { |
66 | struct platform_device *pdev; | 69 | struct platform_device *pdev; |
67 | void __iomem *base; | 70 | void __iomem *base; |
@@ -277,7 +280,7 @@ void dss_dump_clocks(struct seq_file *s) | |||
277 | dss_runtime_put(); | 280 | dss_runtime_put(); |
278 | } | 281 | } |
279 | 282 | ||
280 | void dss_dump_regs(struct seq_file *s) | 283 | static void dss_dump_regs(struct seq_file *s) |
281 | { | 284 | { |
282 | #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dss_read_reg(r)) | 285 | #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dss_read_reg(r)) |
283 | 286 | ||
@@ -322,6 +325,7 @@ void dss_select_dispc_clk_source(enum omap_dss_clk_source clk_src) | |||
322 | break; | 325 | break; |
323 | default: | 326 | default: |
324 | BUG(); | 327 | BUG(); |
328 | return; | ||
325 | } | 329 | } |
326 | 330 | ||
327 | dss_feat_get_reg_field(FEAT_REG_DISPC_CLK_SWITCH, &start, &end); | 331 | dss_feat_get_reg_field(FEAT_REG_DISPC_CLK_SWITCH, &start, &end); |
@@ -335,7 +339,7 @@ void dss_select_dsi_clk_source(int dsi_module, | |||
335 | enum omap_dss_clk_source clk_src) | 339 | enum omap_dss_clk_source clk_src) |
336 | { | 340 | { |
337 | struct platform_device *dsidev; | 341 | struct platform_device *dsidev; |
338 | int b; | 342 | int b, pos; |
339 | 343 | ||
340 | switch (clk_src) { | 344 | switch (clk_src) { |
341 | case OMAP_DSS_CLK_SRC_FCK: | 345 | case OMAP_DSS_CLK_SRC_FCK: |
@@ -355,9 +359,11 @@ void dss_select_dsi_clk_source(int dsi_module, | |||
355 | break; | 359 | break; |
356 | default: | 360 | default: |
357 | BUG(); | 361 | BUG(); |
362 | return; | ||
358 | } | 363 | } |
359 | 364 | ||
360 | REG_FLD_MOD(DSS_CONTROL, b, 1, 1); /* DSI_CLK_SWITCH */ | 365 | pos = dsi_module == 0 ? 1 : 10; |
366 | REG_FLD_MOD(DSS_CONTROL, b, pos, pos); /* DSIx_CLK_SWITCH */ | ||
361 | 367 | ||
362 | dss.dsi_clk_source[dsi_module] = clk_src; | 368 | dss.dsi_clk_source[dsi_module] = clk_src; |
363 | } | 369 | } |
@@ -389,6 +395,7 @@ void dss_select_lcd_clk_source(enum omap_channel channel, | |||
389 | break; | 395 | break; |
390 | default: | 396 | default: |
391 | BUG(); | 397 | BUG(); |
398 | return; | ||
392 | } | 399 | } |
393 | 400 | ||
394 | pos = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 12; | 401 | pos = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 12; |
@@ -706,7 +713,7 @@ static void dss_put_clocks(void) | |||
706 | clk_put(dss.dss_clk); | 713 | clk_put(dss.dss_clk); |
707 | } | 714 | } |
708 | 715 | ||
709 | int dss_runtime_get(void) | 716 | static int dss_runtime_get(void) |
710 | { | 717 | { |
711 | int r; | 718 | int r; |
712 | 719 | ||
@@ -717,7 +724,7 @@ int dss_runtime_get(void) | |||
717 | return r < 0 ? r : 0; | 724 | return r < 0 ? r : 0; |
718 | } | 725 | } |
719 | 726 | ||
720 | void dss_runtime_put(void) | 727 | static void dss_runtime_put(void) |
721 | { | 728 | { |
722 | int r; | 729 | int r; |
723 | 730 | ||
@@ -740,7 +747,7 @@ void dss_debug_dump_clocks(struct seq_file *s) | |||
740 | #endif | 747 | #endif |
741 | 748 | ||
742 | /* DSS HW IP initialisation */ | 749 | /* DSS HW IP initialisation */ |
743 | static int omap_dsshw_probe(struct platform_device *pdev) | 750 | static int __init omap_dsshw_probe(struct platform_device *pdev) |
744 | { | 751 | { |
745 | struct resource *dss_mem; | 752 | struct resource *dss_mem; |
746 | u32 rev; | 753 | u32 rev; |
@@ -785,40 +792,24 @@ static int omap_dsshw_probe(struct platform_device *pdev) | |||
785 | dss.lcd_clk_source[0] = OMAP_DSS_CLK_SRC_FCK; | 792 | dss.lcd_clk_source[0] = OMAP_DSS_CLK_SRC_FCK; |
786 | dss.lcd_clk_source[1] = OMAP_DSS_CLK_SRC_FCK; | 793 | dss.lcd_clk_source[1] = OMAP_DSS_CLK_SRC_FCK; |
787 | 794 | ||
788 | r = dpi_init(); | ||
789 | if (r) { | ||
790 | DSSERR("Failed to initialize DPI\n"); | ||
791 | goto err_dpi; | ||
792 | } | ||
793 | |||
794 | r = sdi_init(); | ||
795 | if (r) { | ||
796 | DSSERR("Failed to initialize SDI\n"); | ||
797 | goto err_sdi; | ||
798 | } | ||
799 | |||
800 | rev = dss_read_reg(DSS_REVISION); | 795 | rev = dss_read_reg(DSS_REVISION); |
801 | printk(KERN_INFO "OMAP DSS rev %d.%d\n", | 796 | printk(KERN_INFO "OMAP DSS rev %d.%d\n", |
802 | FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); | 797 | FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); |
803 | 798 | ||
804 | dss_runtime_put(); | 799 | dss_runtime_put(); |
805 | 800 | ||
801 | dss_debugfs_create_file("dss", dss_dump_regs); | ||
802 | |||
806 | return 0; | 803 | return 0; |
807 | err_sdi: | 804 | |
808 | dpi_exit(); | ||
809 | err_dpi: | ||
810 | dss_runtime_put(); | ||
811 | err_runtime_get: | 805 | err_runtime_get: |
812 | pm_runtime_disable(&pdev->dev); | 806 | pm_runtime_disable(&pdev->dev); |
813 | dss_put_clocks(); | 807 | dss_put_clocks(); |
814 | return r; | 808 | return r; |
815 | } | 809 | } |
816 | 810 | ||
817 | static int omap_dsshw_remove(struct platform_device *pdev) | 811 | static int __exit omap_dsshw_remove(struct platform_device *pdev) |
818 | { | 812 | { |
819 | dpi_exit(); | ||
820 | sdi_exit(); | ||
821 | |||
822 | pm_runtime_disable(&pdev->dev); | 813 | pm_runtime_disable(&pdev->dev); |
823 | 814 | ||
824 | dss_put_clocks(); | 815 | dss_put_clocks(); |
@@ -829,11 +820,24 @@ static int omap_dsshw_remove(struct platform_device *pdev) | |||
829 | static int dss_runtime_suspend(struct device *dev) | 820 | static int dss_runtime_suspend(struct device *dev) |
830 | { | 821 | { |
831 | dss_save_context(); | 822 | dss_save_context(); |
823 | dss_set_min_bus_tput(dev, 0); | ||
832 | return 0; | 824 | return 0; |
833 | } | 825 | } |
834 | 826 | ||
835 | static int dss_runtime_resume(struct device *dev) | 827 | static int dss_runtime_resume(struct device *dev) |
836 | { | 828 | { |
829 | int r; | ||
830 | /* | ||
831 | * Set an arbitrarily high tput request to ensure OPP100. | ||
832 | * What we should really do is to make a request to stay in OPP100, | ||
833 | * without any tput requirements, but that is not currently possible | ||
834 | * via the PM layer. | ||
835 | */ | ||
836 | |||
837 | r = dss_set_min_bus_tput(dev, 1000000000); | ||
838 | if (r) | ||
839 | return r; | ||
840 | |||
837 | dss_restore_context(); | 841 | dss_restore_context(); |
838 | return 0; | 842 | return 0; |
839 | } | 843 | } |
@@ -844,8 +848,7 @@ static const struct dev_pm_ops dss_pm_ops = { | |||
844 | }; | 848 | }; |
845 | 849 | ||
846 | static struct platform_driver omap_dsshw_driver = { | 850 | static struct platform_driver omap_dsshw_driver = { |
847 | .probe = omap_dsshw_probe, | 851 | .remove = __exit_p(omap_dsshw_remove), |
848 | .remove = omap_dsshw_remove, | ||
849 | .driver = { | 852 | .driver = { |
850 | .name = "omapdss_dss", | 853 | .name = "omapdss_dss", |
851 | .owner = THIS_MODULE, | 854 | .owner = THIS_MODULE, |
@@ -853,12 +856,12 @@ static struct platform_driver omap_dsshw_driver = { | |||
853 | }, | 856 | }, |
854 | }; | 857 | }; |
855 | 858 | ||
856 | int dss_init_platform_driver(void) | 859 | int __init dss_init_platform_driver(void) |
857 | { | 860 | { |
858 | return platform_driver_register(&omap_dsshw_driver); | 861 | return platform_driver_probe(&omap_dsshw_driver, omap_dsshw_probe); |
859 | } | 862 | } |
860 | 863 | ||
861 | void dss_uninit_platform_driver(void) | 864 | void dss_uninit_platform_driver(void) |
862 | { | 865 | { |
863 | return platform_driver_unregister(&omap_dsshw_driver); | 866 | platform_driver_unregister(&omap_dsshw_driver); |
864 | } | 867 | } |