]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
mfd: omap-usb-tll: Move configuration code to omap_tll_init()
authorRoger Quadros <rogerq@ti.com>
Tue, 29 Jan 2013 13:00:03 +0000 (15:00 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Tue, 9 Apr 2013 07:46:23 +0000 (09:46 +0200)
This is because we want to get rid of platform_data usage from probe().
The only information we need is PORT_MODE, and this can be supplied
to us by the user (i.e. omap-usb-host.c).

We also move channel clock management from runtime PM handlers into
omap_tll_enable/disable().

Signed-off-by: Roger Quadros <rogerq@ti.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/omap-usb-host.c
drivers/mfd/omap-usb-tll.c
drivers/mfd/omap-usb.h

index 2520facd4ccc31c8887218233646b46f5b41aa41..eb5db28b3fbd5172161d0e7b3a3b85e070d5239d 100644 (file)
@@ -278,7 +278,7 @@ static int usbhs_runtime_resume(struct device *dev)
 
        dev_dbg(dev, "usbhs_runtime_resume\n");
 
-       omap_tll_enable();
+       omap_tll_enable(pdata);
 
        if (!IS_ERR(omap->ehci_logic_fck))
                clk_enable(omap->ehci_logic_fck);
@@ -353,7 +353,7 @@ static int usbhs_runtime_suspend(struct device *dev)
        if (!IS_ERR(omap->ehci_logic_fck))
                clk_disable(omap->ehci_logic_fck);
 
-       omap_tll_disable();
+       omap_tll_disable(pdata);
 
        return 0;
 }
@@ -527,6 +527,9 @@ static int usbhs_omap_probe(struct platform_device *pdev)
 
        omap->pdata = pdata;
 
+       /* Initialize the TLL subsystem */
+       omap_tll_init(pdata);
+
        pm_runtime_enable(dev);
 
        platform_set_drvdata(pdev, omap);
index 0aef1a768880550a3e18ae7da547f55e76cc6fd4..f7d2568729c1f16e6f4c9d1a8779622a0a001485 100644 (file)
@@ -1,8 +1,9 @@
 /**
  * omap-usb-tll.c - The USB TLL driver for OMAP EHCI & OHCI
  *
- * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (C) 2012-2013 Texas Instruments Incorporated - http://www.ti.com
  * Author: Keshava Munegowda <keshava_mgowda@ti.com>
+ * Author: Roger Quadros <rogerq@ti.com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2  of
 
 struct usbtll_omap {
        int                                     nch;    /* num. of channels */
-       struct usbhs_omap_platform_data         *pdata;
        struct clk                              **ch_clk;
+       void __iomem                            *base;
 };
 
 /*-------------------------------------------------------------------------*/
@@ -210,14 +211,10 @@ static unsigned ohci_omap3_fslsmode(enum usbhs_omap_port_mode mode)
 static int usbtll_omap_probe(struct platform_device *pdev)
 {
        struct device                           *dev =  &pdev->dev;
-       struct usbhs_omap_platform_data         *pdata = dev->platform_data;
-       void __iomem                            *base;
        struct resource                         *res;
        struct usbtll_omap                      *tll;
-       unsigned                                reg;
        int                                     ret = 0;
        int                                     i, ver;
-       bool needs_tll;
 
        dev_dbg(dev, "starting TI HSUSB TLL Controller\n");
 
@@ -227,16 +224,9 @@ static int usbtll_omap_probe(struct platform_device *pdev)
                return -ENOMEM;
        }
 
-       if (!pdata) {
-               dev_err(dev, "Platform data missing\n");
-               return -ENODEV;
-       }
-
-       tll->pdata = pdata;
-
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_request_and_ioremap(dev, res);
-       if (!base) {
+       tll->base = devm_request_and_ioremap(dev, res);
+       if (!tll->base) {
                ret = -EADDRNOTAVAIL;
                dev_err(dev, "Resource request/ioremap failed:%d\n", ret);
                return ret;
@@ -246,7 +236,7 @@ static int usbtll_omap_probe(struct platform_device *pdev)
        pm_runtime_enable(dev);
        pm_runtime_get_sync(dev);
 
-       ver =  usbtll_read(base, OMAP_USBTLL_REVISION);
+       ver =  usbtll_read(tll->base, OMAP_USBTLL_REVISION);
        switch (ver) {
        case OMAP_USBTLL_REV1:
        case OMAP_USBTLL_REV4:
@@ -283,11 +273,77 @@ static int usbtll_omap_probe(struct platform_device *pdev)
                        dev_dbg(dev, "can't get clock : %s\n", clkname);
        }
 
+       pm_runtime_put_sync(dev);
+       /* only after this can omap_tll_enable/disable work */
+       spin_lock(&tll_lock);
+       tll_dev = dev;
+       spin_unlock(&tll_lock);
+
+       return 0;
+
+err_clk_alloc:
+       pm_runtime_put_sync(dev);
+       pm_runtime_disable(dev);
+
+       return ret;
+}
+
+/**
+ * usbtll_omap_remove - shutdown processing for UHH & TLL HCDs
+ * @pdev: USB Host Controller being removed
+ *
+ * Reverses the effect of usbtll_omap_probe().
+ */
+static int usbtll_omap_remove(struct platform_device *pdev)
+{
+       struct usbtll_omap *tll = platform_get_drvdata(pdev);
+       int i;
+
+       spin_lock(&tll_lock);
+       tll_dev = NULL;
+       spin_unlock(&tll_lock);
+
+       for (i = 0; i < tll->nch; i++)
+               if (!IS_ERR(tll->ch_clk[i]))
+                       clk_put(tll->ch_clk[i]);
+
+       pm_runtime_disable(&pdev->dev);
+       return 0;
+}
+
+static struct platform_driver usbtll_omap_driver = {
+       .driver = {
+               .name           = (char *)usbtll_driver_name,
+               .owner          = THIS_MODULE,
+       },
+       .probe          = usbtll_omap_probe,
+       .remove         = usbtll_omap_remove,
+};
+
+int omap_tll_init(struct usbhs_omap_platform_data *pdata)
+{
+       int i;
+       bool needs_tll;
+       unsigned reg;
+       struct usbtll_omap *tll;
+
+       spin_lock(&tll_lock);
+
+       if (!tll_dev) {
+               spin_unlock(&tll_lock);
+               return -ENODEV;
+       }
+
+       tll = dev_get_drvdata(tll_dev);
+
        needs_tll = false;
        for (i = 0; i < tll->nch; i++)
                needs_tll |= omap_usb_mode_needs_tll(pdata->port_mode[i]);
 
+       pm_runtime_get_sync(tll_dev);
+
        if (needs_tll) {
+               void __iomem *base = tll->base;
 
                /* Program Common TLL register */
                reg = usbtll_read(base, OMAP_TLL_SHARED_CONF);
@@ -336,51 +392,29 @@ static int usbtll_omap_probe(struct platform_device *pdev)
                }
        }
 
-       pm_runtime_put_sync(dev);
-       /* only after this can omap_tll_enable/disable work */
-       spin_lock(&tll_lock);
-       tll_dev = dev;
+       pm_runtime_put_sync(tll_dev);
+
        spin_unlock(&tll_lock);
 
        return 0;
-
-err_clk_alloc:
-       pm_runtime_put_sync(dev);
-       pm_runtime_disable(dev);
-
-       return ret;
 }
+EXPORT_SYMBOL_GPL(omap_tll_init);
 
-/**
- * usbtll_omap_remove - shutdown processing for UHH & TLL HCDs
- * @pdev: USB Host Controller being removed
- *
- * Reverses the effect of usbtll_omap_probe().
- */
-static int usbtll_omap_remove(struct platform_device *pdev)
+int omap_tll_enable(struct usbhs_omap_platform_data *pdata)
 {
-       struct usbtll_omap *tll = platform_get_drvdata(pdev);
        int i;
+       struct usbtll_omap *tll;
 
        spin_lock(&tll_lock);
-       tll_dev = NULL;
-       spin_unlock(&tll_lock);
-
-       for (i = 0; i < tll->nch; i++)
-               if (!IS_ERR(tll->ch_clk[i]))
-                       clk_put(tll->ch_clk[i]);
 
-       pm_runtime_disable(&pdev->dev);
-       return 0;
-}
+       if (!tll_dev) {
+               spin_unlock(&tll_lock);
+               return -ENODEV;
+       }
 
-static int usbtll_runtime_resume(struct device *dev)
-{
-       struct usbtll_omap                      *tll = dev_get_drvdata(dev);
-       struct usbhs_omap_platform_data         *pdata = tll->pdata;
-       int i;
+       tll = dev_get_drvdata(tll_dev);
 
-       dev_dbg(dev, "usbtll_runtime_resume\n");
+       pm_runtime_get_sync(tll_dev);
 
        for (i = 0; i < tll->nch; i++) {
                if (omap_usb_mode_needs_tll(pdata->port_mode[i])) {
@@ -391,22 +425,31 @@ static int usbtll_runtime_resume(struct device *dev)
 
                        r = clk_enable(tll->ch_clk[i]);
                        if (r) {
-                               dev_err(dev,
+                               dev_err(tll_dev,
                                 "Error enabling ch %d clock: %d\n", i, r);
                        }
                }
        }
 
+       spin_unlock(&tll_lock);
+
        return 0;
 }
+EXPORT_SYMBOL_GPL(omap_tll_enable);
 
-static int usbtll_runtime_suspend(struct device *dev)
+int omap_tll_disable(struct usbhs_omap_platform_data *pdata)
 {
-       struct usbtll_omap                      *tll = dev_get_drvdata(dev);
-       struct usbhs_omap_platform_data         *pdata = tll->pdata;
        int i;
+       struct usbtll_omap *tll;
+
+       spin_lock(&tll_lock);
+
+       if (!tll_dev) {
+               spin_unlock(&tll_lock);
+               return -ENODEV;
+       }
 
-       dev_dbg(dev, "usbtll_runtime_suspend\n");
+       tll = dev_get_drvdata(tll_dev);
 
        for (i = 0; i < tll->nch; i++) {
                if (omap_usb_mode_needs_tll(pdata->port_mode[i])) {
@@ -415,60 +458,11 @@ static int usbtll_runtime_suspend(struct device *dev)
                }
        }
 
-       return 0;
-}
-
-static const struct dev_pm_ops usbtllomap_dev_pm_ops = {
-       SET_RUNTIME_PM_OPS(usbtll_runtime_suspend,
-                          usbtll_runtime_resume,
-                          NULL)
-};
-
-static struct platform_driver usbtll_omap_driver = {
-       .driver = {
-               .name           = (char *)usbtll_driver_name,
-               .owner          = THIS_MODULE,
-               .pm             = &usbtllomap_dev_pm_ops,
-       },
-       .probe          = usbtll_omap_probe,
-       .remove         = usbtll_omap_remove,
-};
-
-int omap_tll_enable(void)
-{
-       int ret;
-
-       spin_lock(&tll_lock);
-
-       if (!tll_dev) {
-               pr_err("%s: OMAP USB TLL not initialized\n", __func__);
-               ret = -ENODEV;
-       } else {
-               ret = pm_runtime_get_sync(tll_dev);
-       }
+       pm_runtime_put_sync(tll_dev);
 
        spin_unlock(&tll_lock);
 
-       return ret;
-}
-EXPORT_SYMBOL_GPL(omap_tll_enable);
-
-int omap_tll_disable(void)
-{
-       int ret;
-
-       spin_lock(&tll_lock);
-
-       if (!tll_dev) {
-               pr_err("%s: OMAP USB TLL not initialized\n", __func__);
-               ret = -ENODEV;
-       } else {
-               ret = pm_runtime_put_sync(tll_dev);
-       }
-
-       spin_unlock(&tll_lock);
-
-       return ret;
+       return 0;
 }
 EXPORT_SYMBOL_GPL(omap_tll_disable);
 
index 972aa961b06489e60752941668ef79548167f451..2a508b6aeac8d9595eaf7dff4e07003eb943289e 100644 (file)
@@ -1,2 +1,3 @@
-extern int omap_tll_enable(void);
-extern int omap_tll_disable(void);
+extern int omap_tll_init(struct usbhs_omap_platform_data *pdata);
+extern int omap_tll_enable(struct usbhs_omap_platform_data *pdata);
+extern int omap_tll_disable(struct usbhs_omap_platform_data *pdata);