|
@@ -100,6 +100,7 @@ static int rfbi_convert_timings(struct rfbi_timings *t);
|
|
static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div);
|
|
static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div);
|
|
|
|
|
|
static struct {
|
|
static struct {
|
|
|
|
+ struct platform_device *pdev;
|
|
void __iomem *base;
|
|
void __iomem *base;
|
|
|
|
|
|
unsigned long l4_khz;
|
|
unsigned long l4_khz;
|
|
@@ -957,50 +958,6 @@ void rfbi_dump_regs(struct seq_file *s)
|
|
#undef DUMPREG
|
|
#undef DUMPREG
|
|
}
|
|
}
|
|
|
|
|
|
-int rfbi_init(void)
|
|
|
|
-{
|
|
|
|
- u32 rev;
|
|
|
|
- u32 l;
|
|
|
|
-
|
|
|
|
- spin_lock_init(&rfbi.cmd_lock);
|
|
|
|
-
|
|
|
|
- init_completion(&rfbi.cmd_done);
|
|
|
|
- atomic_set(&rfbi.cmd_fifo_full, 0);
|
|
|
|
- atomic_set(&rfbi.cmd_pending, 0);
|
|
|
|
-
|
|
|
|
- rfbi.base = ioremap(RFBI_BASE, SZ_256);
|
|
|
|
- if (!rfbi.base) {
|
|
|
|
- DSSERR("can't ioremap RFBI\n");
|
|
|
|
- return -ENOMEM;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- rfbi_enable_clocks(1);
|
|
|
|
-
|
|
|
|
- msleep(10);
|
|
|
|
-
|
|
|
|
- rfbi.l4_khz = dss_clk_get_rate(DSS_CLK_ICK) / 1000;
|
|
|
|
-
|
|
|
|
- /* Enable autoidle and smart-idle */
|
|
|
|
- l = rfbi_read_reg(RFBI_SYSCONFIG);
|
|
|
|
- l |= (1 << 0) | (2 << 3);
|
|
|
|
- rfbi_write_reg(RFBI_SYSCONFIG, l);
|
|
|
|
-
|
|
|
|
- rev = rfbi_read_reg(RFBI_REVISION);
|
|
|
|
- printk(KERN_INFO "OMAP RFBI rev %d.%d\n",
|
|
|
|
- FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
|
|
|
|
-
|
|
|
|
- rfbi_enable_clocks(0);
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void rfbi_exit(void)
|
|
|
|
-{
|
|
|
|
- DSSDBG("rfbi_exit\n");
|
|
|
|
-
|
|
|
|
- iounmap(rfbi.base);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev)
|
|
int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev)
|
|
{
|
|
{
|
|
int r;
|
|
int r;
|
|
@@ -1056,3 +1013,68 @@ int rfbi_init_display(struct omap_dss_device *dssdev)
|
|
dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
|
|
dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+/* RFBI HW IP initialisation */
|
|
|
|
+static int omap_rfbihw_probe(struct platform_device *pdev)
|
|
|
|
+{
|
|
|
|
+ u32 rev;
|
|
|
|
+ u32 l;
|
|
|
|
+
|
|
|
|
+ rfbi.pdev = pdev;
|
|
|
|
+
|
|
|
|
+ spin_lock_init(&rfbi.cmd_lock);
|
|
|
|
+
|
|
|
|
+ init_completion(&rfbi.cmd_done);
|
|
|
|
+ atomic_set(&rfbi.cmd_fifo_full, 0);
|
|
|
|
+ atomic_set(&rfbi.cmd_pending, 0);
|
|
|
|
+
|
|
|
|
+ rfbi.base = ioremap(RFBI_BASE, SZ_256);
|
|
|
|
+ if (!rfbi.base) {
|
|
|
|
+ DSSERR("can't ioremap RFBI\n");
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ rfbi_enable_clocks(1);
|
|
|
|
+
|
|
|
|
+ msleep(10);
|
|
|
|
+
|
|
|
|
+ rfbi.l4_khz = dss_clk_get_rate(DSS_CLK_ICK) / 1000;
|
|
|
|
+
|
|
|
|
+ /* Enable autoidle and smart-idle */
|
|
|
|
+ l = rfbi_read_reg(RFBI_SYSCONFIG);
|
|
|
|
+ l |= (1 << 0) | (2 << 3);
|
|
|
|
+ rfbi_write_reg(RFBI_SYSCONFIG, l);
|
|
|
|
+
|
|
|
|
+ rev = rfbi_read_reg(RFBI_REVISION);
|
|
|
|
+ printk(KERN_INFO "OMAP RFBI rev %d.%d\n",
|
|
|
|
+ FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
|
|
|
|
+
|
|
|
|
+ rfbi_enable_clocks(0);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int omap_rfbihw_remove(struct platform_device *pdev)
|
|
|
|
+{
|
|
|
|
+ iounmap(rfbi.base);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct platform_driver omap_rfbihw_driver = {
|
|
|
|
+ .probe = omap_rfbihw_probe,
|
|
|
|
+ .remove = omap_rfbihw_remove,
|
|
|
|
+ .driver = {
|
|
|
|
+ .name = "omapdss_rfbi",
|
|
|
|
+ .owner = THIS_MODULE,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+int rfbi_init_platform_driver(void)
|
|
|
|
+{
|
|
|
|
+ return platform_driver_register(&omap_rfbihw_driver);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void rfbi_uninit_platform_driver(void)
|
|
|
|
+{
|
|
|
|
+ return platform_driver_unregister(&omap_rfbihw_driver);
|
|
|
|
+}
|