mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
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: Ohad Ben-Cohen <ohad@wizery.com>
This commit is contained in:
parent
315d8f5ccd
commit
e467b64214
@ -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)
|
|||||||
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)
|
|||||||
/* 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 {
|
|||||||
* @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 {
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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 = {
|
|||||||
.remove = omap_hwspinlock_remove,
|
.remove = omap_hwspinlock_remove,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "omap_hwspinlock",
|
.name = "omap_hwspinlock",
|
||||||
|
.owner = THIS_MODULE,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user