diff options
author | Jens Rottmann <[email protected]> | 2010-08-10 18:03:12 -0700 |
---|---|---|
committer | Linus Torvalds <[email protected]> | 2010-08-11 08:59:20 -0700 |
commit | ecd6269174c04da5efbd17d6bff793e428eb45ef (patch) | |
tree | 9dbf1a8b0843ffc52f9f2fb9202acd096db3c755 | |
parent | e73790a57abc1320b3c3a94da43ae24359687d7c (diff) |
cs5535-mfgpt: reuse timers that have never been set up
The MFGPT hardware may be set up only once, therefore
cs5535_mfgpt_free_timer() didn't re-set the timer's "avail" bit. However
if a timer is freed before it has actually been in use then it may be made
available again.
Signed-off-by: Jens Rottmann <[email protected]>
Acked-by: Andres Salomon <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Jordan Crouse <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
-rw-r--r-- | drivers/misc/cs5535-mfgpt.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/misc/cs5535-mfgpt.c b/drivers/misc/cs5535-mfgpt.c index 2d44b3300104..6f6218061b0d 100644 --- a/drivers/misc/cs5535-mfgpt.c +++ b/drivers/misc/cs5535-mfgpt.c @@ -211,6 +211,17 @@ EXPORT_SYMBOL_GPL(cs5535_mfgpt_alloc_timer); */ void cs5535_mfgpt_free_timer(struct cs5535_mfgpt_timer *timer) { + unsigned long flags; + uint16_t val; + + /* timer can be made available again only if never set up */ + val = cs5535_mfgpt_read(timer, MFGPT_REG_SETUP); + if (!(val & MFGPT_SETUP_SETUP)) { + spin_lock_irqsave(&timer->chip->lock, flags); + __set_bit(timer->nr, timer->chip->avail); + spin_unlock_irqrestore(&timer->chip->lock, flags); + } + kfree(timer); } EXPORT_SYMBOL_GPL(cs5535_mfgpt_free_timer); |