| 211 | } |
| 212 | |
| 213 | void |
| 214 | clock_register_flags(device_t clockdev, long resolution, int flags) |
| 215 | { |
| 216 | struct rtc_instance *rtc, *newrtc; |
| 217 | |
| 218 | newrtc = malloc(sizeof(*newrtc), M_DEVBUF, M_WAITOK); |
| 219 | newrtc->clockdev = clockdev; |
| 220 | newrtc->resolution = (int)resolution; |
| 221 | newrtc->flags = flags; |
| 222 | newrtc->schedns = 0; |
| 223 | newrtc->resadj.tv_sec = newrtc->resolution / 2 / 1000000; |
| 224 | newrtc->resadj.tv_nsec = newrtc->resolution / 2 % 1000000 * 1000; |
| 225 | TIMEOUT_TASK_INIT(taskqueue_thread, &newrtc->stask, 0, |
| 226 | settime_task_func, newrtc); |
| 227 | |
| 228 | sx_xlock(&rtc_list_lock); |
| 229 | if (LIST_EMPTY(&rtc_list)) { |
| 230 | LIST_INSERT_HEAD(&rtc_list, newrtc, rtc_entries); |
| 231 | } else { |
| 232 | LIST_FOREACH(rtc, &rtc_list, rtc_entries) { |
| 233 | if (rtc->resolution > newrtc->resolution) { |
| 234 | LIST_INSERT_BEFORE(rtc, newrtc, rtc_entries); |
| 235 | break; |
| 236 | } else if (LIST_NEXT(rtc, rtc_entries) == NULL) { |
| 237 | LIST_INSERT_AFTER(rtc, newrtc, rtc_entries); |
| 238 | break; |
| 239 | } |
| 240 | } |
| 241 | } |
| 242 | sx_xunlock(&rtc_list_lock); |
| 243 | |
| 244 | device_printf(clockdev, |
| 245 | "registered as a time-of-day clock, resolution %d.%6.6ds\n", |
| 246 | newrtc->resolution / 1000000, newrtc->resolution % 1000000); |
| 247 | } |
| 248 | |
| 249 | void |
| 250 | clock_register(device_t dev, long res) |
no test coverage detected