lkml.org 
[lkml]   [2013]   [Jan]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 08/22] mfd: omap-usb-tll: serialize access to TLL device
    Date
    Get rid of the unnecessary spin_lock_irqsave/restore() as there is
    no interrupt handler for this driver. Instead we serialize access
    to tll_dev using a global spinlock.

    Signed-off-by: Roger Quadros <rogerq@ti.com>
    ---
    drivers/mfd/omap-usb-tll.c | 53 ++++++++++++++++++++++---------------------
    1 files changed, 27 insertions(+), 26 deletions(-)

    diff --git a/drivers/mfd/omap-usb-tll.c b/drivers/mfd/omap-usb-tll.c
    index 81d2cac..9f9cfc2 100644
    --- a/drivers/mfd/omap-usb-tll.c
    +++ b/drivers/mfd/omap-usb-tll.c
    @@ -103,14 +103,13 @@ struct usbtll_omap {
    int nch; /* num. of channels */
    struct usbhs_omap_platform_data *pdata;
    struct clk **ch_clk;
    - /* secure the register updates */
    - spinlock_t lock;
    };

    /*-------------------------------------------------------------------------*/

    static const char usbtll_driver_name[] = USBTLL_DRIVER_NAME;
    static struct device *tll_dev;
    +static DEFINE_SPINLOCK(tll_lock); /* serialize access to tll_dev */

    /*-------------------------------------------------------------------------*/

    @@ -212,7 +211,6 @@ static int usbtll_omap_probe(struct platform_device *pdev)
    struct resource *res;
    struct usbtll_omap *tll;
    unsigned reg;
    - unsigned long flags;
    int ret = 0;
    int i, ver;
    bool needs_tll;
    @@ -230,8 +228,6 @@ static int usbtll_omap_probe(struct platform_device *pdev)
    return -ENODEV;
    }

    - spin_lock_init(&tll->lock);
    -
    tll->pdata = pdata;

    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    @@ -246,8 +242,6 @@ static int usbtll_omap_probe(struct platform_device *pdev)
    pm_runtime_enable(dev);
    pm_runtime_get_sync(dev);

    - spin_lock_irqsave(&tll->lock, flags);
    -
    ver = usbtll_read(base, OMAP_USBTLL_REVISION);
    switch (ver) {
    case OMAP_USBTLL_REV1:
    @@ -265,8 +259,6 @@ static int usbtll_omap_probe(struct platform_device *pdev)
    break;
    }

    - spin_unlock_irqrestore(&tll->lock, flags);
    -
    tll->ch_clk = devm_kzalloc(dev, sizeof(struct clk * [tll->nch]),
    GFP_KERNEL);
    if (!tll->ch_clk) {
    @@ -289,8 +281,6 @@ static int usbtll_omap_probe(struct platform_device *pdev)
    tll->ch_clk[i] = fck;
    }

    - spin_lock_irqsave(&tll->lock, flags);
    -
    needs_tll = false;
    for (i = 0; i < tll->nch; i++)
    needs_tll |= omap_usb_mode_needs_tll(pdata->port_mode[i]);
    @@ -335,10 +325,11 @@ static int usbtll_omap_probe(struct platform_device *pdev)
    }
    }

    - spin_unlock_irqrestore(&tll->lock, flags);
    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;

    @@ -360,7 +351,9 @@ 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++)
    clk_put(tll->ch_clk[i]);
    @@ -373,13 +366,10 @@ static int usbtll_runtime_resume(struct device *dev)
    {
    struct usbtll_omap *tll = dev_get_drvdata(dev);
    struct usbhs_omap_platform_data *pdata = tll->pdata;
    - unsigned long flags;
    int i;

    dev_dbg(dev, "usbtll_runtime_resume\n");

    - spin_lock_irqsave(&tll->lock, flags);
    -
    for (i = 0; i < tll->nch; i++) {
    if (omap_usb_mode_needs_tll(pdata->port_mode[i])) {
    int r;
    @@ -395,8 +385,6 @@ static int usbtll_runtime_resume(struct device *dev)
    }
    }

    - spin_unlock_irqrestore(&tll->lock, flags);
    -
    return 0;
    }

    @@ -404,13 +392,10 @@ static int usbtll_runtime_suspend(struct device *dev)
    {
    struct usbtll_omap *tll = dev_get_drvdata(dev);
    struct usbhs_omap_platform_data *pdata = tll->pdata;
    - unsigned long flags;
    int i;

    dev_dbg(dev, "usbtll_runtime_suspend\n");

    - spin_lock_irqsave(&tll->lock, flags);
    -
    for (i = 0; i < tll->nch; i++) {
    if (omap_usb_mode_needs_tll(pdata->port_mode[i])) {
    if (tll->ch_clk[i])
    @@ -418,8 +403,6 @@ static int usbtll_runtime_suspend(struct device *dev)
    }
    }

    - spin_unlock_irqrestore(&tll->lock, flags);
    -
    return 0;
    }

    @@ -441,21 +424,39 @@ static struct platform_driver usbtll_omap_driver = {

    int omap_tll_enable(void)
    {
    + int ret;
    +
    + spin_lock(&tll_lock);
    +
    if (!tll_dev) {
    pr_err("%s: OMAP USB TLL not initialized\n", __func__);
    - return -ENODEV;
    + ret = -ENODEV;
    + } else {
    + ret = pm_runtime_get_sync(tll_dev);
    }
    - return pm_runtime_get_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__);
    - return -ENODEV;
    + ret = -ENODEV;
    + } else {
    + ret = pm_runtime_put_sync(tll_dev);
    }
    - return pm_runtime_put_sync(tll_dev);
    +
    + spin_unlock(&tll_lock);
    +
    + return ret;
    }
    EXPORT_SYMBOL_GPL(omap_tll_disable);

    --
    1.7.4.1


    \
     
     \ /
      Last update: 2013-01-17 15:41    [W:2.175 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site