diff options
-rw-r--r-- | drivers/video/omap2/dss/core.c | 8 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dss.h | 8 | ||||
-rw-r--r-- | drivers/video/omap2/dss/rfbi.c | 110 |
3 files changed, 74 insertions, 52 deletions
diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c index 255935541d0d..8eef616fee03 100644 --- a/drivers/video/omap2/dss/core.c +++ b/drivers/video/omap2/dss/core.c | |||
@@ -201,9 +201,9 @@ static int omap_dss_probe(struct platform_device *pdev) | |||
201 | /* keep clocks enabled to prevent context saves/restores during init */ | 201 | /* keep clocks enabled to prevent context saves/restores during init */ |
202 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); | 202 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); |
203 | 203 | ||
204 | r = rfbi_init(); | 204 | r = rfbi_init_platform_driver(); |
205 | if (r) { | 205 | if (r) { |
206 | DSSERR("Failed to initialize rfbi\n"); | 206 | DSSERR("Failed to initialize rfbi platform driver\n"); |
207 | goto err_rfbi; | 207 | goto err_rfbi; |
208 | } | 208 | } |
209 | 209 | ||
@@ -285,7 +285,7 @@ err_venc: | |||
285 | err_dispc: | 285 | err_dispc: |
286 | dpi_exit(); | 286 | dpi_exit(); |
287 | err_dpi: | 287 | err_dpi: |
288 | rfbi_exit(); | 288 | rfbi_uninit_platform_driver(); |
289 | err_rfbi: | 289 | err_rfbi: |
290 | dss_uninit_platform_driver(); | 290 | dss_uninit_platform_driver(); |
291 | err_dss: | 291 | err_dss: |
@@ -303,7 +303,7 @@ static int omap_dss_remove(struct platform_device *pdev) | |||
303 | venc_exit(); | 303 | venc_exit(); |
304 | dispc_exit(); | 304 | dispc_exit(); |
305 | dpi_exit(); | 305 | dpi_exit(); |
306 | rfbi_exit(); | 306 | rfbi_uninit_platform_driver(); |
307 | if (cpu_is_omap34xx()) { | 307 | if (cpu_is_omap34xx()) { |
308 | dsi_exit(); | 308 | dsi_exit(); |
309 | sdi_exit(); | 309 | sdi_exit(); |
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h index c535ee1db3ee..0ba4bdbd6b01 100644 --- a/drivers/video/omap2/dss/dss.h +++ b/drivers/video/omap2/dss/dss.h | |||
@@ -428,8 +428,8 @@ static inline void venc_exit(void) | |||
428 | 428 | ||
429 | /* RFBI */ | 429 | /* RFBI */ |
430 | #ifdef CONFIG_OMAP2_DSS_RFBI | 430 | #ifdef CONFIG_OMAP2_DSS_RFBI |
431 | int rfbi_init(void); | 431 | int rfbi_init_platform_driver(void); |
432 | void rfbi_exit(void); | 432 | void rfbi_uninit_platform_driver(void); |
433 | void rfbi_dump_regs(struct seq_file *s); | 433 | void rfbi_dump_regs(struct seq_file *s); |
434 | 434 | ||
435 | int rfbi_configure(int rfbi_module, int bpp, int lines); | 435 | int rfbi_configure(int rfbi_module, int bpp, int lines); |
@@ -440,11 +440,11 @@ void rfbi_set_timings(int rfbi_module, struct rfbi_timings *t); | |||
440 | unsigned long rfbi_get_max_tx_rate(void); | 440 | unsigned long rfbi_get_max_tx_rate(void); |
441 | int rfbi_init_display(struct omap_dss_device *display); | 441 | int rfbi_init_display(struct omap_dss_device *display); |
442 | #else | 442 | #else |
443 | static inline int rfbi_init(void) | 443 | static inline int rfbi_init_platform_driver(void) |
444 | { | 444 | { |
445 | return 0; | 445 | return 0; |
446 | } | 446 | } |
447 | static inline void rfbi_exit(void) | 447 | static inline void rfbi_uninit_platform_driver(void) |
448 | { | 448 | { |
449 | } | 449 | } |
450 | #endif | 450 | #endif |
diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c index 10a2ffe02882..153f963e8e89 100644 --- a/drivers/video/omap2/dss/rfbi.c +++ b/drivers/video/omap2/dss/rfbi.c | |||
@@ -100,6 +100,7 @@ static int rfbi_convert_timings(struct rfbi_timings *t); | |||
100 | static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div); | 100 | static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div); |
101 | 101 | ||
102 | static struct { | 102 | static struct { |
103 | struct platform_device *pdev; | ||
103 | void __iomem *base; | 104 | void __iomem *base; |
104 | 105 | ||
105 | unsigned long l4_khz; | 106 | unsigned long l4_khz; |
@@ -957,50 +958,6 @@ void rfbi_dump_regs(struct seq_file *s) | |||
957 | #undef DUMPREG | 958 | #undef DUMPREG |
958 | } | 959 | } |
959 | 960 | ||
960 | int rfbi_init(void) | ||
961 | { | ||
962 | u32 rev; | ||
963 | u32 l; | ||
964 | |||
965 | spin_lock_init(&rfbi.cmd_lock); | ||
966 | |||
967 | init_completion(&rfbi.cmd_done); | ||
968 | atomic_set(&rfbi.cmd_fifo_full, 0); | ||
969 | atomic_set(&rfbi.cmd_pending, 0); | ||
970 | |||
971 | rfbi.base = ioremap(RFBI_BASE, SZ_256); | ||
972 | if (!rfbi.base) { | ||
973 | DSSERR("can't ioremap RFBI\n"); | ||
974 | return -ENOMEM; | ||
975 | } | ||
976 | |||
977 | rfbi_enable_clocks(1); | ||
978 | |||
979 | msleep(10); | ||
980 | |||
981 | rfbi.l4_khz = dss_clk_get_rate(DSS_CLK_ICK) / 1000; | ||
982 | |||
983 | /* Enable autoidle and smart-idle */ | ||
984 | l = rfbi_read_reg(RFBI_SYSCONFIG); | ||
985 | l |= (1 << 0) | (2 << 3); | ||
986 | rfbi_write_reg(RFBI_SYSCONFIG, l); | ||
987 | |||
988 | rev = rfbi_read_reg(RFBI_REVISION); | ||
989 | printk(KERN_INFO "OMAP RFBI rev %d.%d\n", | ||
990 | FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); | ||
991 | |||
992 | rfbi_enable_clocks(0); | ||
993 | |||
994 | return 0; | ||
995 | } | ||
996 | |||
997 | void rfbi_exit(void) | ||
998 | { | ||
999 | DSSDBG("rfbi_exit\n"); | ||
1000 | |||
1001 | iounmap(rfbi.base); | ||
1002 | } | ||
1003 | |||
1004 | int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev) | 961 | int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev) |
1005 | { | 962 | { |
1006 | int r; | 963 | int r; |
@@ -1056,3 +1013,68 @@ int rfbi_init_display(struct omap_dss_device *dssdev) | |||
1056 | dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; | 1013 | dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; |
1057 | return 0; | 1014 | return 0; |
1058 | } | 1015 | } |
1016 | |||
1017 | /* RFBI HW IP initialisation */ | ||
1018 | static int omap_rfbihw_probe(struct platform_device *pdev) | ||
1019 | { | ||
1020 | u32 rev; | ||
1021 | u32 l; | ||
1022 | |||
1023 | rfbi.pdev = pdev; | ||
1024 | |||
1025 | spin_lock_init(&rfbi.cmd_lock); | ||
1026 | |||
1027 | init_completion(&rfbi.cmd_done); | ||
1028 | atomic_set(&rfbi.cmd_fifo_full, 0); | ||
1029 | atomic_set(&rfbi.cmd_pending, 0); | ||
1030 | |||
1031 | rfbi.base = ioremap(RFBI_BASE, SZ_256); | ||
1032 | if (!rfbi.base) { | ||
1033 | DSSERR("can't ioremap RFBI\n"); | ||
1034 | return -ENOMEM; | ||
1035 | } | ||
1036 | |||
1037 | rfbi_enable_clocks(1); | ||
1038 | |||
1039 | msleep(10); | ||
1040 | |||
1041 | rfbi.l4_khz = dss_clk_get_rate(DSS_CLK_ICK) / 1000; | ||
1042 | |||
1043 | /* Enable autoidle and smart-idle */ | ||
1044 | l = rfbi_read_reg(RFBI_SYSCONFIG); | ||
1045 | l |= (1 << 0) | (2 << 3); | ||
1046 | rfbi_write_reg(RFBI_SYSCONFIG, l); | ||
1047 | |||
1048 | rev = rfbi_read_reg(RFBI_REVISION); | ||
1049 | printk(KERN_INFO "OMAP RFBI rev %d.%d\n", | ||
1050 | FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); | ||
1051 | |||
1052 | rfbi_enable_clocks(0); | ||
1053 | |||
1054 | return 0; | ||
1055 | } | ||
1056 | |||
1057 | static int omap_rfbihw_remove(struct platform_device *pdev) | ||
1058 | { | ||
1059 | iounmap(rfbi.base); | ||
1060 | return 0; | ||
1061 | } | ||
1062 | |||
1063 | static struct platform_driver omap_rfbihw_driver = { | ||
1064 | .probe = omap_rfbihw_probe, | ||
1065 | .remove = omap_rfbihw_remove, | ||
1066 | .driver = { | ||
1067 | .name = "omapdss_rfbi", | ||
1068 | .owner = THIS_MODULE, | ||
1069 | }, | ||
1070 | }; | ||
1071 | |||
1072 | int rfbi_init_platform_driver(void) | ||
1073 | { | ||
1074 | return platform_driver_register(&omap_rfbihw_driver); | ||
1075 | } | ||
1076 | |||
1077 | void rfbi_uninit_platform_driver(void) | ||
1078 | { | ||
1079 | return platform_driver_unregister(&omap_rfbihw_driver); | ||
1080 | } | ||