diff options
Diffstat (limited to 'drivers/video/omap2/dss/rfbi.c')
-rw-r--r-- | drivers/video/omap2/dss/rfbi.c | 128 |
1 files changed, 77 insertions, 51 deletions
diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c index 10a2ffe0288..5ea17f49c61 100644 --- a/drivers/video/omap2/dss/rfbi.c +++ b/drivers/video/omap2/dss/rfbi.c | |||
@@ -36,8 +36,6 @@ | |||
36 | #include <plat/display.h> | 36 | #include <plat/display.h> |
37 | #include "dss.h" | 37 | #include "dss.h" |
38 | 38 | ||
39 | #define RFBI_BASE 0x48050800 | ||
40 | |||
41 | struct rfbi_reg { u16 idx; }; | 39 | struct rfbi_reg { u16 idx; }; |
42 | 40 | ||
43 | #define RFBI_REG(idx) ((const struct rfbi_reg) { idx }) | 41 | #define RFBI_REG(idx) ((const struct rfbi_reg) { idx }) |
@@ -100,6 +98,7 @@ static int rfbi_convert_timings(struct rfbi_timings *t); | |||
100 | static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div); | 98 | static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div); |
101 | 99 | ||
102 | static struct { | 100 | static struct { |
101 | struct platform_device *pdev; | ||
103 | void __iomem *base; | 102 | void __iomem *base; |
104 | 103 | ||
105 | unsigned long l4_khz; | 104 | unsigned long l4_khz; |
@@ -142,9 +141,9 @@ static inline u32 rfbi_read_reg(const struct rfbi_reg idx) | |||
142 | static void rfbi_enable_clocks(bool enable) | 141 | static void rfbi_enable_clocks(bool enable) |
143 | { | 142 | { |
144 | if (enable) | 143 | if (enable) |
145 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); | 144 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); |
146 | else | 145 | else |
147 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); | 146 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); |
148 | } | 147 | } |
149 | 148 | ||
150 | void omap_rfbi_write_command(const void *buf, u32 len) | 149 | void omap_rfbi_write_command(const void *buf, u32 len) |
@@ -497,7 +496,7 @@ unsigned long rfbi_get_max_tx_rate(void) | |||
497 | }; | 496 | }; |
498 | 497 | ||
499 | l4_rate = rfbi.l4_khz / 1000; | 498 | l4_rate = rfbi.l4_khz / 1000; |
500 | dss1_rate = dss_clk_get_rate(DSS_CLK_FCK1) / 1000000; | 499 | dss1_rate = dss_clk_get_rate(DSS_CLK_FCK) / 1000000; |
501 | 500 | ||
502 | for (i = 0; i < ARRAY_SIZE(ftab); i++) { | 501 | for (i = 0; i < ARRAY_SIZE(ftab); i++) { |
503 | /* Use a window instead of an exact match, to account | 502 | /* Use a window instead of an exact match, to account |
@@ -922,7 +921,7 @@ void rfbi_dump_regs(struct seq_file *s) | |||
922 | { | 921 | { |
923 | #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, rfbi_read_reg(r)) | 922 | #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, rfbi_read_reg(r)) |
924 | 923 | ||
925 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); | 924 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); |
926 | 925 | ||
927 | DUMPREG(RFBI_REVISION); | 926 | DUMPREG(RFBI_REVISION); |
928 | DUMPREG(RFBI_SYSCONFIG); | 927 | DUMPREG(RFBI_SYSCONFIG); |
@@ -953,54 +952,10 @@ void rfbi_dump_regs(struct seq_file *s) | |||
953 | DUMPREG(RFBI_VSYNC_WIDTH); | 952 | DUMPREG(RFBI_VSYNC_WIDTH); |
954 | DUMPREG(RFBI_HSYNC_WIDTH); | 953 | DUMPREG(RFBI_HSYNC_WIDTH); |
955 | 954 | ||
956 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); | 955 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); |
957 | #undef DUMPREG | 956 | #undef DUMPREG |
958 | } | 957 | } |
959 | 958 | ||
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) | 959 | int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev) |
1005 | { | 960 | { |
1006 | int r; | 961 | int r; |
@@ -1056,3 +1011,74 @@ int rfbi_init_display(struct omap_dss_device *dssdev) | |||
1056 | dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; | 1011 | dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; |
1057 | return 0; | 1012 | return 0; |
1058 | } | 1013 | } |
1014 | |||
1015 | /* RFBI HW IP initialisation */ | ||
1016 | static int omap_rfbihw_probe(struct platform_device *pdev) | ||
1017 | { | ||
1018 | u32 rev; | ||
1019 | u32 l; | ||
1020 | struct resource *rfbi_mem; | ||
1021 | |||
1022 | rfbi.pdev = pdev; | ||
1023 | |||
1024 | spin_lock_init(&rfbi.cmd_lock); | ||
1025 | |||
1026 | init_completion(&rfbi.cmd_done); | ||
1027 | atomic_set(&rfbi.cmd_fifo_full, 0); | ||
1028 | atomic_set(&rfbi.cmd_pending, 0); | ||
1029 | |||
1030 | rfbi_mem = platform_get_resource(rfbi.pdev, IORESOURCE_MEM, 0); | ||
1031 | if (!rfbi_mem) { | ||
1032 | DSSERR("can't get IORESOURCE_MEM RFBI\n"); | ||
1033 | return -EINVAL; | ||
1034 | } | ||
1035 | rfbi.base = ioremap(rfbi_mem->start, resource_size(rfbi_mem)); | ||
1036 | if (!rfbi.base) { | ||
1037 | DSSERR("can't ioremap RFBI\n"); | ||
1038 | return -ENOMEM; | ||
1039 | } | ||
1040 | |||
1041 | rfbi_enable_clocks(1); | ||
1042 | |||
1043 | msleep(10); | ||
1044 | |||
1045 | rfbi.l4_khz = dss_clk_get_rate(DSS_CLK_ICK) / 1000; | ||
1046 | |||
1047 | /* Enable autoidle and smart-idle */ | ||
1048 | l = rfbi_read_reg(RFBI_SYSCONFIG); | ||
1049 | l |= (1 << 0) | (2 << 3); | ||
1050 | rfbi_write_reg(RFBI_SYSCONFIG, l); | ||
1051 | |||
1052 | rev = rfbi_read_reg(RFBI_REVISION); | ||
1053 | dev_dbg(&pdev->dev, "OMAP RFBI rev %d.%d\n", | ||
1054 | FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); | ||
1055 | |||
1056 | rfbi_enable_clocks(0); | ||
1057 | |||
1058 | return 0; | ||
1059 | } | ||
1060 | |||
1061 | static int omap_rfbihw_remove(struct platform_device *pdev) | ||
1062 | { | ||
1063 | iounmap(rfbi.base); | ||
1064 | return 0; | ||
1065 | } | ||
1066 | |||
1067 | static struct platform_driver omap_rfbihw_driver = { | ||
1068 | .probe = omap_rfbihw_probe, | ||
1069 | .remove = omap_rfbihw_remove, | ||
1070 | .driver = { | ||
1071 | .name = "omapdss_rfbi", | ||
1072 | .owner = THIS_MODULE, | ||
1073 | }, | ||
1074 | }; | ||
1075 | |||
1076 | int rfbi_init_platform_driver(void) | ||
1077 | { | ||
1078 | return platform_driver_register(&omap_rfbihw_driver); | ||
1079 | } | ||
1080 | |||
1081 | void rfbi_uninit_platform_driver(void) | ||
1082 | { | ||
1083 | return platform_driver_unregister(&omap_rfbihw_driver); | ||
1084 | } | ||