Commit e467b642 authored by Ohad Ben-Cohen's avatar Ohad Ben-Cohen

hwspinlock/core: simplify 'owner' handling

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: default avatarOhad Ben-Cohen <ohad@wizery.com>
parent 315d8f5c
...@@ -256,18 +256,16 @@ underlying hwspinlock implementation using the hwspin_lock_register() API. ...@@ -256,18 +256,16 @@ underlying hwspinlock implementation using the hwspin_lock_register() API.
* @ops: vendor-specific hwspinlock handlers * @ops: vendor-specific hwspinlock handlers
* @id: a global, unique, system-wide, index of the lock. * @id: a global, unique, system-wide, index of the lock.
* @lock: initialized and used by hwspinlock core * @lock: initialized and used by hwspinlock core
* @owner: underlying implementation module, used to maintain module ref count
*/ */
struct hwspinlock { struct hwspinlock {
struct device *dev; struct device *dev;
const struct hwspinlock_ops *ops; const struct hwspinlock_ops *ops;
int id; int id;
spinlock_t lock; spinlock_t lock;
struct module *owner;
}; };
The underlying implementation is responsible to assign the dev, ops, id and The underlying implementation is responsible to assign the dev, ops and id
owner members. The lock member, OTOH, is initialized and used by the hwspinlock members. The lock member, OTOH, is initialized and used by the hwspinlock
core. core.
6. Implementation callbacks 6. Implementation callbacks
......
...@@ -352,7 +352,7 @@ static int __hwspin_lock_request(struct hwspinlock *hwlock) ...@@ -352,7 +352,7 @@ static int __hwspin_lock_request(struct hwspinlock *hwlock)
int ret; int ret;
/* prevent underlying implementation from being removed */ /* 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__); dev_err(hwlock->dev, "%s: can't get owner\n", __func__);
return -EINVAL; return -EINVAL;
} }
...@@ -535,7 +535,7 @@ int hwspin_lock_free(struct hwspinlock *hwlock) ...@@ -535,7 +535,7 @@ int hwspin_lock_free(struct hwspinlock *hwlock)
/* sanity check (this shouldn't happen) */ /* sanity check (this shouldn't happen) */
WARN_ON(tmp != hwlock); WARN_ON(tmp != hwlock);
module_put(hwlock->owner); module_put(hwlock->dev->driver->owner);
out: out:
spin_unlock(&hwspinlock_tree_lock); spin_unlock(&hwspinlock_tree_lock);
......
...@@ -44,10 +44,9 @@ struct hwspinlock_ops { ...@@ -44,10 +44,9 @@ struct hwspinlock_ops {
* @ops: platform-specific hwspinlock handlers * @ops: platform-specific hwspinlock handlers
* @id: a global, unique, system-wide, index of the lock. * @id: a global, unique, system-wide, index of the lock.
* @lock: initialized and used by hwspinlock core * @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 * 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. * per-platform struct, and have all hwspinlocks point at it.
*/ */
struct hwspinlock { struct hwspinlock {
...@@ -55,7 +54,6 @@ struct hwspinlock { ...@@ -55,7 +54,6 @@ struct hwspinlock {
const struct hwspinlock_ops *ops; const struct hwspinlock_ops *ops;
int id; int id;
spinlock_t lock; spinlock_t lock;
struct module *owner;
}; };
#endif /* __HWSPINLOCK_HWSPINLOCK_H */ #endif /* __HWSPINLOCK_HWSPINLOCK_H */
...@@ -143,7 +143,6 @@ static int __devinit omap_hwspinlock_probe(struct platform_device *pdev) ...@@ -143,7 +143,6 @@ static int __devinit omap_hwspinlock_probe(struct platform_device *pdev)
} }
omap_lock->lock.dev = &pdev->dev; omap_lock->lock.dev = &pdev->dev;
omap_lock->lock.owner = THIS_MODULE;
omap_lock->lock.id = i; omap_lock->lock.id = i;
omap_lock->lock.ops = &omap_hwspinlock_ops; omap_lock->lock.ops = &omap_hwspinlock_ops;
omap_lock->addr = io_base + LOCK_BASE_OFFSET + sizeof(u32) * i; omap_lock->addr = io_base + LOCK_BASE_OFFSET + sizeof(u32) * i;
...@@ -208,6 +207,7 @@ static struct platform_driver omap_hwspinlock_driver = { ...@@ -208,6 +207,7 @@ static struct platform_driver omap_hwspinlock_driver = {
.remove = omap_hwspinlock_remove, .remove = omap_hwspinlock_remove,
.driver = { .driver = {
.name = "omap_hwspinlock", .name = "omap_hwspinlock",
.owner = THIS_MODULE,
}, },
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment