diff options
| author | David Woodhouse <dwmw2@infradead.org> | 2008-02-03 02:29:41 -0500 |
|---|---|---|
| committer | David Woodhouse <dwmw2@infradead.org> | 2008-02-03 02:30:32 -0500 |
| commit | c1f3ee120bb61045b1c0a3ead620d1d65af47130 (patch) | |
| tree | 908430bf2b47fe8e96ac623ae7ab6dd5698d0938 /drivers/rtc/interface.c | |
| parent | e619a75ff6201b567a539e787aa9af9bc63a3187 (diff) | |
| parent | 9135f1901ee6449dfe338adf6e40e9c2025b8150 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Diffstat (limited to 'drivers/rtc/interface.c')
| -rw-r--r-- | drivers/rtc/interface.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index de0da545c7a1..7e3ad4f3b343 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
| @@ -251,20 +251,23 @@ void rtc_update_irq(struct rtc_device *rtc, | |||
| 251 | } | 251 | } |
| 252 | EXPORT_SYMBOL_GPL(rtc_update_irq); | 252 | EXPORT_SYMBOL_GPL(rtc_update_irq); |
| 253 | 253 | ||
| 254 | static int __rtc_match(struct device *dev, void *data) | ||
| 255 | { | ||
| 256 | char *name = (char *)data; | ||
| 257 | |||
| 258 | if (strncmp(dev->bus_id, name, BUS_ID_SIZE) == 0) | ||
| 259 | return 1; | ||
| 260 | return 0; | ||
| 261 | } | ||
| 262 | |||
| 254 | struct rtc_device *rtc_class_open(char *name) | 263 | struct rtc_device *rtc_class_open(char *name) |
| 255 | { | 264 | { |
| 256 | struct device *dev; | 265 | struct device *dev; |
| 257 | struct rtc_device *rtc = NULL; | 266 | struct rtc_device *rtc = NULL; |
| 258 | 267 | ||
| 259 | down(&rtc_class->sem); | 268 | dev = class_find_device(rtc_class, name, __rtc_match); |
| 260 | list_for_each_entry(dev, &rtc_class->devices, node) { | 269 | if (dev) |
| 261 | if (strncmp(dev->bus_id, name, BUS_ID_SIZE) == 0) { | 270 | rtc = to_rtc_device(dev); |
| 262 | dev = get_device(dev); | ||
| 263 | if (dev) | ||
| 264 | rtc = to_rtc_device(dev); | ||
| 265 | break; | ||
| 266 | } | ||
| 267 | } | ||
| 268 | 271 | ||
| 269 | if (rtc) { | 272 | if (rtc) { |
| 270 | if (!try_module_get(rtc->owner)) { | 273 | if (!try_module_get(rtc->owner)) { |
| @@ -272,7 +275,6 @@ struct rtc_device *rtc_class_open(char *name) | |||
| 272 | rtc = NULL; | 275 | rtc = NULL; |
| 273 | } | 276 | } |
| 274 | } | 277 | } |
| 275 | up(&rtc_class->sem); | ||
| 276 | 278 | ||
| 277 | return rtc; | 279 | return rtc; |
| 278 | } | 280 | } |
| @@ -293,7 +295,7 @@ int rtc_irq_register(struct rtc_device *rtc, struct rtc_task *task) | |||
| 293 | return -EINVAL; | 295 | return -EINVAL; |
| 294 | 296 | ||
| 295 | /* Cannot register while the char dev is in use */ | 297 | /* Cannot register while the char dev is in use */ |
| 296 | if (!(mutex_trylock(&rtc->char_lock))) | 298 | if (test_and_set_bit_lock(RTC_DEV_BUSY, &rtc->flags)) |
| 297 | return -EBUSY; | 299 | return -EBUSY; |
| 298 | 300 | ||
| 299 | spin_lock_irq(&rtc->irq_task_lock); | 301 | spin_lock_irq(&rtc->irq_task_lock); |
| @@ -303,7 +305,7 @@ int rtc_irq_register(struct rtc_device *rtc, struct rtc_task *task) | |||
| 303 | } | 305 | } |
| 304 | spin_unlock_irq(&rtc->irq_task_lock); | 306 | spin_unlock_irq(&rtc->irq_task_lock); |
| 305 | 307 | ||
| 306 | mutex_unlock(&rtc->char_lock); | 308 | clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags); |
| 307 | 309 | ||
| 308 | return retval; | 310 | return retval; |
| 309 | } | 311 | } |
