]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/misc/sti/sdti.c
SDTI: Fix sdti to use right clocks from clockfw
[linux-2.6-omap-h63xx.git] / drivers / misc / sti / sdti.c
index 4514783dd45035f30230553a22aa0670e1846481..8c275049ad7d130570c6955b65640a8609d4110d 100644 (file)
 #define CPU1_TRACE_EN          0x01
 #define CPU2_TRACE_EN          0x02
 
-static struct clk *sdti_ck;
+#define SDTI_SYSCONFIG_SOFTRESET       (1 << 1)
+#define SDTI_SYSCONFIG_AUTOIDLE                (1 << 0)
+
+static struct clk *sdti_fck, *sdti_ick;
 void __iomem *sti_base, *sti_channel_base;
 static DEFINE_SPINLOCK(sdti_lock);
 
-void omap_sti_channel_write_trace(int len, int id, void *data,
+void sti_channel_write_trace(int len, int id, void *data,
                                unsigned int channel)
 {
        const u8 *tpntr = data;
@@ -49,13 +52,13 @@ void omap_sti_channel_write_trace(int len, int id, void *data,
 
        spin_unlock_irq(&sdti_lock);
 }
-EXPORT_SYMBOL(omap_sti_channel_write_trace);
+EXPORT_SYMBOL(sti_channel_write_trace);
 
 static void omap_sdti_reset(void)
 {
        int i;
 
-       sti_writel(0x02, SDTI_SYSCONFIG);
+       sti_writel(SDTI_SYSCONFIG_SOFTRESET, SDTI_SYSCONFIG);
 
        for (i = 0; i < 10000; i++)
                if (sti_readl(SDTI_SYSSTATUS) & 1)
@@ -67,18 +70,37 @@ static void omap_sdti_reset(void)
 static int __init omap_sdti_init(void)
 {
        char buf[64];
-       int i;
+       int i, ret = 0;
 
-       sdti_ck = clk_get(NULL, "emu_per_alwon_ck");
-       if (IS_ERR(sdti_ck)) {
-               printk(KERN_ERR "Cannot get clk emu_per_alwon_ck\n");
-               return PTR_ERR(sdti_ck);
+       sdti_fck = clk_get(NULL, "pclk_fck");
+       if (IS_ERR(sdti_fck)) {
+               printk(KERN_ERR "Cannot get clk pclk_fck\n");
+               ret = PTR_ERR(sdti_fck);
+               goto err0;
+       }
+       sdti_ick = clk_get(NULL, "pclkx2_fck");
+       if (IS_ERR(sdti_ick)) {
+               printk(KERN_ERR "Cannot get clk pclkx2_fck\n");
+               ret = PTR_ERR(sdti_ick);
+               goto err1;
+       }
+       ret = clk_enable(sdti_fck);
+       if (ret) {
+               printk(KERN_ERR "Cannot enable sdti_fck\n");
+               goto err2;
+       }
+       ret = clk_enable(sdti_ick);
+       if (ret) {
+               printk(KERN_ERR "Cannot enable sdti_ick\n");
+               goto err3;
        }
-       clk_enable(sdti_ck);
 
        omap_sdti_reset();
        sti_writel(0xC5ACCE55, SDTI_LOCK_ACCESS);
 
+       /* Autoidle */
+       sti_writel(SDTI_SYSCONFIG_AUTOIDLE, SDTI_SYSCONFIG);
+
        /* Claim SDTI */
        sti_writel(1 << 30, SDTI_WINCTRL);
        i = sti_readl(SDTI_WINCTRL);
@@ -99,16 +121,27 @@ static int __init omap_sdti_init(void)
        snprintf(buf, sizeof(buf), "OMAP SDTI support loaded (HW v%u.%u)\n",
                (i >> 4) & 0x0f, i & 0x0f);
        printk(KERN_INFO "%s", buf);
-       omap_sti_channel_write_trace(strlen(buf), 0xc3, buf, 239);
-
-       return 0;
+       sti_channel_write_trace(strlen(buf), 0xc3, buf, 239);
+
+       return ret;
+
+err3:
+       clk_disable(sdti_fck);
+err2:
+       clk_put(sdti_ick);
+err1:
+       clk_put(sdti_fck);
+err0:
+       return ret;
 }
 
 static void omap_sdti_exit(void)
 {
        sti_writel(0, SDTI_WINCTRL);
-       clk_disable(sdti_ck);
-       clk_put(sdti_ck);
+       clk_disable(sdti_fck);
+       clk_disable(sdti_ick);
+       clk_put(sdti_fck);
+       clk_put(sdti_ick);
 }
 
 static int __devinit omap_sdti_probe(struct platform_device *pdev)