Merge tag 'hwspinlock-3.17' of git://git.kernel.org/pub/scm/linux/kernel/git/ohad...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 14 Aug 2014 16:11:58 +0000 (10:11 -0600)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 14 Aug 2014 16:11:58 +0000 (10:11 -0600)
Pull hwspinlock updates from Ohad Ben-Cohen:
 "Two small hwspinlock changes for better OMAP support, coming from
  Suman Anna"

* tag 'hwspinlock-3.17' of git://git.kernel.org/pub/scm/linux/kernel/git/ohad/hwspinlock:
  hwspinlock: enable OMAP build for AM33xx, AM43xx & DRA7xx
  hwspinlock/omap: enable module before reading SYSSTATUS register

drivers/hwspinlock/Kconfig
drivers/hwspinlock/omap_hwspinlock.c

index 70637d23b1f92ad6688300060dadeb4f892ccff9..3612cb5b30b206a066c75d835402654cacf7d002 100644 (file)
@@ -10,7 +10,7 @@ menu "Hardware Spinlock drivers"
 
 config HWSPINLOCK_OMAP
        tristate "OMAP Hardware Spinlock device"
-       depends on ARCH_OMAP4 || SOC_OMAP5
+       depends on ARCH_OMAP4 || SOC_OMAP5 || SOC_DRA7XX || SOC_AM33XX || SOC_AM43XX
        select HWSPINLOCK
        help
          Say y here to support the OMAP Hardware Spinlock device (firstly
index 292869cc90343fd330ce29e9bcdf3c8575a2b7f7..c1e2cd4d85fe3f98034bfc70bc9ebd420cdcca30 100644 (file)
@@ -98,10 +98,29 @@ static int omap_hwspinlock_probe(struct platform_device *pdev)
        if (!io_base)
                return -ENOMEM;
 
+       /*
+        * make sure the module is enabled and clocked before reading
+        * the module SYSSTATUS register
+        */
+       pm_runtime_enable(&pdev->dev);
+       ret = pm_runtime_get_sync(&pdev->dev);
+       if (ret < 0) {
+               pm_runtime_put_noidle(&pdev->dev);
+               goto iounmap_base;
+       }
+
        /* Determine number of locks */
        i = readl(io_base + SYSSTATUS_OFFSET);
        i >>= SPINLOCK_NUMLOCKS_BIT_OFFSET;
 
+       /*
+        * runtime PM will make sure the clock of this module is
+        * enabled again iff at least one lock is requested
+        */
+       ret = pm_runtime_put(&pdev->dev);
+       if (ret < 0)
+               goto iounmap_base;
+
        /* one of the four lsb's must be set, and nothing else */
        if (hweight_long(i & 0xf) != 1 || i > 8) {
                ret = -EINVAL;
@@ -121,12 +140,6 @@ static int omap_hwspinlock_probe(struct platform_device *pdev)
        for (i = 0, hwlock = &bank->lock[0]; i < num_locks; i++, hwlock++)
                hwlock->priv = io_base + LOCK_BASE_OFFSET + sizeof(u32) * i;
 
-       /*
-        * runtime PM will make sure the clock of this module is
-        * enabled iff at least one lock is requested
-        */
-       pm_runtime_enable(&pdev->dev);
-
        ret = hwspin_lock_register(bank, &pdev->dev, &omap_hwspinlock_ops,
                                                pdata->base_id, num_locks);
        if (ret)
@@ -135,9 +148,9 @@ static int omap_hwspinlock_probe(struct platform_device *pdev)
        return 0;
 
 reg_fail:
-       pm_runtime_disable(&pdev->dev);
        kfree(bank);
 iounmap_base:
+       pm_runtime_disable(&pdev->dev);
        iounmap(io_base);
        return ret;
 }