Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <JRottmann@LiPPERTEmbedded.de>
Acked-by: Andres Salomon <dilinger@queued.net>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jordan Crouse <jordan@cosmicpenguin.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Jens Rottmann and committed by
Linus Torvalds
ecd62691 e73790a5

+11
+11
drivers/misc/cs5535-mfgpt.c
··· 211 211 */ 212 212 void cs5535_mfgpt_free_timer(struct cs5535_mfgpt_timer *timer) 213 213 { 214 + unsigned long flags; 215 + uint16_t val; 216 + 217 + /* timer can be made available again only if never set up */ 218 + val = cs5535_mfgpt_read(timer, MFGPT_REG_SETUP); 219 + if (!(val & MFGPT_SETUP_SETUP)) { 220 + spin_lock_irqsave(&timer->chip->lock, flags); 221 + __set_bit(timer->nr, timer->chip->avail); 222 + spin_unlock_irqrestore(&timer->chip->lock, flags); 223 + } 224 + 214 225 kfree(timer); 215 226 } 216 227 EXPORT_SYMBOL_GPL(cs5535_mfgpt_free_timer);