]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/arm/plat-omap/mcbsp.c
REMOVE OMAP LEGACY CODE: Reset clocks and PM code to mainline
[linux-2.6-omap-h63xx.git] / arch / arm / plat-omap / mcbsp.c
index e2e8b76483c1b3dfcd09d3cb2e00eb8f1795b461..28b0a824b8cfa1bff4f7d2b4ea27cd494bd1bfbe 100644 (file)
@@ -214,7 +214,6 @@ EXPORT_SYMBOL(omap_mcbsp_set_io_type);
 int omap_mcbsp_request(unsigned int id)
 {
        struct omap_mcbsp *mcbsp;
-       int i;
        int err;
 
        if (!omap_mcbsp_check_valid_id(id)) {
@@ -223,37 +222,22 @@ int omap_mcbsp_request(unsigned int id)
        }
        mcbsp = id_to_mcbsp_ptr(id);
 
-       if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request)
-               mcbsp->pdata->ops->request(id);
-
        spin_lock(&mcbsp->lock);
        if (!mcbsp->free) {
                dev_err(mcbsp->dev, "McBSP%d is currently in use\n",
                        mcbsp->id);
                spin_unlock(&mcbsp->lock);
-               return -1;
+               return -EBUSY;
        }
 
        mcbsp->free = 0;
        spin_unlock(&mcbsp->lock);
 
-       for (i = 0; i < mcbsp->num_clks; i++)
-               clk_enable(mcbsp->clks[i]);
-
-       /*
-        * Enable wakup behavior, smart idle and all wakeups
-        * REVISIT: some wakeups may be unnecessary
-        */
-       if (cpu_is_omap34xx()) {
-               u16 w;
-
-               w = OMAP_MCBSP_READ(mcbsp->io_base, SYSCON);
-               w &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03));
-               w |= (ENAWAKEUP | SIDLEMODE(0x02) | CLOCKACTIVITY(0x02));
-               OMAP_MCBSP_WRITE(mcbsp->io_base, SYSCON, w);
+       if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request)
+               mcbsp->pdata->ops->request(id);
 
-               OMAP_MCBSP_WRITE(mcbsp->io_base, WAKEUPEN, WAKEUPEN_ALL);
-       }
+       clk_enable(mcbsp->iclk);
+       clk_enable(mcbsp->fclk);
 
        /*
         * Make sure that transmitter, receiver and sample-rate generator are
@@ -293,7 +277,6 @@ EXPORT_SYMBOL(omap_mcbsp_request);
 void omap_mcbsp_free(unsigned int id)
 {
        struct omap_mcbsp *mcbsp;
-       int i;
 
        if (!omap_mcbsp_check_valid_id(id)) {
                printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
@@ -301,24 +284,18 @@ void omap_mcbsp_free(unsigned int id)
        }
        mcbsp = id_to_mcbsp_ptr(id);
 
-       /*
-        * Disable wakup behavior, smart idle and all wakeups
-        */
-       if (cpu_is_omap34xx()) {
-               u16 w;
+       if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
+               mcbsp->pdata->ops->free(id);
 
-               w = OMAP_MCBSP_READ(mcbsp->io_base, SYSCON);
-               w &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03));
-               OMAP_MCBSP_WRITE(mcbsp->io_base, SYSCON, w);
+       clk_disable(mcbsp->fclk);
+       clk_disable(mcbsp->iclk);
 
-               w = OMAP_MCBSP_READ(mcbsp->io_base, WAKEUPEN);
-               w &= ~WAKEUPEN_ALL;
-               OMAP_MCBSP_WRITE(mcbsp->io_base, WAKEUPEN, w);
+       if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) {
+               /* Free IRQs */
+               free_irq(mcbsp->rx_irq, (void *)mcbsp);
+               free_irq(mcbsp->tx_irq, (void *)mcbsp);
        }
 
-       if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
-               mcbsp->pdata->ops->free(id);
-
        spin_lock(&mcbsp->lock);
        if (mcbsp->free) {
                dev_err(mcbsp->dev, "McBSP%d was not reserved\n",
@@ -326,20 +303,9 @@ void omap_mcbsp_free(unsigned int id)
                spin_unlock(&mcbsp->lock);
                return;
        }
-       spin_unlock(&mcbsp->lock);
-
-       for (i = mcbsp->num_clks - 1; i >= 0; i--)
-               clk_disable(mcbsp->clks[i]);
 
-       spin_lock(&mcbsp->lock);
        mcbsp->free = 1;
        spin_unlock(&mcbsp->lock);
-
-       if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) {
-               /* Free IRQs */
-               free_irq(mcbsp->rx_irq, (void *)mcbsp);
-               free_irq(mcbsp->tx_irq, (void *)mcbsp);
-       }
 }
 EXPORT_SYMBOL(omap_mcbsp_free);
 
@@ -908,7 +874,6 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
        struct omap_mcbsp_platform_data *pdata = pdev->dev.platform_data;
        struct omap_mcbsp *mcbsp;
        int id = pdev->id - 1;
-       int i;
        int ret = 0;
 
        if (!pdata) {
@@ -931,7 +896,6 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
                ret = -ENOMEM;
                goto exit;
        }
-       mcbsp_ptr[id] = mcbsp;
 
        spin_lock_init(&mcbsp->lock);
        mcbsp->id = id + 1;
@@ -953,39 +917,32 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
        mcbsp->dma_rx_sync = pdata->dma_rx_sync;
        mcbsp->dma_tx_sync = pdata->dma_tx_sync;
 
-       if (pdata->num_clks) {
-               mcbsp->num_clks = pdata->num_clks;
-               mcbsp->clks = kzalloc(mcbsp->num_clks * sizeof(struct clk *),
-                                       GFP_KERNEL);
-               if (!mcbsp->clks) {
-                       ret = -ENOMEM;
-                       goto exit;
-               }
-               for (i = 0; i < mcbsp->num_clks; i++) {
-                       mcbsp->clks[i] = clk_get(&pdev->dev, pdata->clk_names[i]);
-                       if (IS_ERR(mcbsp->clks[i])) {
-                               dev_err(&pdev->dev,
-                                       "Invalid %s configuration for McBSP%d.\n",
-                                       pdata->clk_names[i], mcbsp->id);
-                               ret = PTR_ERR(mcbsp->clks[i]);
-                               goto err_clk;
-                       }
-               }
+       mcbsp->iclk = clk_get(&pdev->dev, "ick");
+       if (IS_ERR(mcbsp->iclk)) {
+               ret = PTR_ERR(mcbsp->iclk);
+               dev_err(&pdev->dev, "unable to get ick: %d\n", ret);
+               goto err_iclk;
+       }
 
+       mcbsp->fclk = clk_get(&pdev->dev, "fck");
+       if (IS_ERR(mcbsp->fclk)) {
+               ret = PTR_ERR(mcbsp->fclk);
+               dev_err(&pdev->dev, "unable to get fck: %d\n", ret);
+               goto err_fclk;
        }
 
        mcbsp->pdata = pdata;
        mcbsp->dev = &pdev->dev;
+       mcbsp_ptr[id] = mcbsp;
        platform_set_drvdata(pdev, mcbsp);
        return 0;
 
-err_clk:
-       while (i--)
-               clk_put(mcbsp->clks[i]);
-       kfree(mcbsp->clks);
+err_fclk:
+       clk_put(mcbsp->iclk);
+err_iclk:
        iounmap(mcbsp->io_base);
 err_ioremap:
-       mcbsp->free = 0;
+       kfree(mcbsp);
 exit:
        return ret;
 }
@@ -993,7 +950,6 @@ exit:
 static int __devexit omap_mcbsp_remove(struct platform_device *pdev)
 {
        struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev);
-       int i;
 
        platform_set_drvdata(pdev, NULL);
        if (mcbsp) {
@@ -1002,18 +958,15 @@ static int __devexit omap_mcbsp_remove(struct platform_device *pdev)
                                mcbsp->pdata->ops->free)
                        mcbsp->pdata->ops->free(mcbsp->id);
 
-               for (i = mcbsp->num_clks - 1; i >= 0; i--) {
-                       clk_disable(mcbsp->clks[i]);
-                       clk_put(mcbsp->clks[i]);
-               }
+               clk_disable(mcbsp->fclk);
+               clk_disable(mcbsp->iclk);
+               clk_put(mcbsp->fclk);
+               clk_put(mcbsp->iclk);
 
                iounmap(mcbsp->io_base);
 
-               if (mcbsp->num_clks) {
-                       kfree(mcbsp->clks);
-                       mcbsp->clks = NULL;
-                       mcbsp->num_clks = 0;
-               }
+               mcbsp->fclk = NULL;
+               mcbsp->iclk = NULL;
                mcbsp->free = 0;
                mcbsp->dev = NULL;
        }
@@ -1034,4 +987,3 @@ int __init omap_mcbsp_init(void)
        /* Register the McBSP driver */
        return platform_driver_register(&omap_mcbsp_driver);
 }
-