hwspinlock/core: simplify 'owner' handling
authorOhad Ben-Cohen <ohad@wizery.com>
Mon, 5 Sep 2011 13:42:36 +0000 (16:42 +0300)
committerOhad Ben-Cohen <ohad@wizery.com>
Wed, 21 Sep 2011 16:45:32 +0000 (19:45 +0300)
Use struct device_driver's owner member instead of asking drivers to
explicitly pass the owner again.

This simplifies drivers and also save some memory, since there's no
point now in maintaining a separate owner pointer per hwspinlock.

Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>

Documentation/hwspinlock.txt
drivers/hwspinlock/hwspinlock_core.c
drivers/hwspinlock/hwspinlock_internal.h
drivers/hwspinlock/omap_hwspinlock.c

index 7dcd1a4..bbaa464 100644 (file)
@@ -256,18 +256,16 @@ underlying hwspinlock implementation using the hwspin_lock_register() API.
  * @ops: vendor-specific hwspinlock handlers
  * @id: a global, unique, system-wide, index of the lock.
  * @lock: initialized and used by hwspinlock core
- * @owner: underlying implementation module, used to maintain module ref count
  */
 struct hwspinlock {
        struct device *dev;
        const struct hwspinlock_ops *ops;
        int id;
        spinlock_t lock;
-       struct module *owner;
 };
 
-The underlying implementation is responsible to assign the dev, ops, id and
-owner members. The lock member, OTOH, is initialized and used by the hwspinlock
+The underlying implementation is responsible to assign the dev, ops and id
+members. The lock member, OTOH, is initialized and used by the hwspinlock
 core.
 
 6. Implementation callbacks
index 43a6271..af5175c 100644 (file)
@@ -352,7 +352,7 @@ static int __hwspin_lock_request(struct hwspinlock *hwlock)
        int ret;
 
        /* prevent underlying implementation from being removed */
-       if (!try_module_get(hwlock->owner)) {
+       if (!try_module_get(hwlock->dev->driver->owner)) {
                dev_err(hwlock->dev, "%s: can't get owner\n", __func__);
                return -EINVAL;
        }
@@ -535,7 +535,7 @@ int hwspin_lock_free(struct hwspinlock *hwlock)
        /* sanity check (this shouldn't happen) */
        WARN_ON(tmp != hwlock);
 
-       module_put(hwlock->owner);
+       module_put(hwlock->dev->driver->owner);
 
 out:
        spin_unlock(&hwspinlock_tree_lock);
index 69935e6..fb25830 100644 (file)
@@ -44,10 +44,9 @@ struct hwspinlock_ops {
  * @ops: platform-specific hwspinlock handlers
  * @id: a global, unique, system-wide, index of the lock.
  * @lock: initialized and used by hwspinlock core
- * @owner: underlying implementation module, used to maintain module ref count
  *
  * Note: currently simplicity was opted for, but later we can squeeze some
- * memory bytes by grouping the dev, ops and owner members in a single
+ * memory bytes by grouping dev, ops in a single
  * per-platform struct, and have all hwspinlocks point at it.
  */
 struct hwspinlock {
@@ -55,7 +54,6 @@ struct hwspinlock {
        const struct hwspinlock_ops *ops;
        int id;
        spinlock_t lock;
-       struct module *owner;
 };
 
 #endif /* __HWSPINLOCK_HWSPINLOCK_H */
index a8f0273..1d19fe9 100644 (file)
@@ -143,7 +143,6 @@ static int __devinit omap_hwspinlock_probe(struct platform_device *pdev)
                }
 
                omap_lock->lock.dev = &pdev->dev;
-               omap_lock->lock.owner = THIS_MODULE;
                omap_lock->lock.id = i;
                omap_lock->lock.ops = &omap_hwspinlock_ops;
                omap_lock->addr = io_base + LOCK_BASE_OFFSET + sizeof(u32) * i;
@@ -208,6 +207,7 @@ static struct platform_driver omap_hwspinlock_driver = {
        .remove         = omap_hwspinlock_remove,
        .driver         = {
                .name   = "omap_hwspinlock",
+               .owner  = THIS_MODULE,
        },
 };