ieee1394: video1394: reorder module init, prepare BKL removal

This prepares video1394 for removal of the BKL (big kernel lock):
It allows video1394_open() to be called while video1394_init_module()
is still in progress.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>

+15 -4
+1 -3
drivers/ieee1394/highlevel.c
··· 228 228 { 229 229 unsigned long flags; 230 230 231 + hpsb_init_highlevel(hl); 231 232 INIT_LIST_HEAD(&hl->addr_list); 232 - INIT_LIST_HEAD(&hl->host_info_list); 233 - 234 - rwlock_init(&hl->host_info_lock); 235 233 236 234 down_write(&hl_drivers_sem); 237 235 list_add_tail(&hl->hl_list, &hl_drivers);
+12 -1
drivers/ieee1394/highlevel.h
··· 2 2 #define IEEE1394_HIGHLEVEL_H 3 3 4 4 #include <linux/list.h> 5 - #include <linux/spinlock_types.h> 5 + #include <linux/spinlock.h> 6 6 #include <linux/types.h> 7 7 8 8 struct module; ··· 103 103 void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction, 104 104 void *data, size_t length); 105 105 106 + /** 107 + * hpsb_init_highlevel - initialize a struct hpsb_highlevel 108 + * 109 + * This is only necessary if hpsb_get_hostinfo_bykey can be called 110 + * before hpsb_register_highlevel. 111 + */ 112 + static inline void hpsb_init_highlevel(struct hpsb_highlevel *hl) 113 + { 114 + rwlock_init(&hl->host_info_lock); 115 + INIT_LIST_HEAD(&hl->host_info_list); 116 + } 106 117 void hpsb_register_highlevel(struct hpsb_highlevel *hl); 107 118 void hpsb_unregister_highlevel(struct hpsb_highlevel *hl); 108 119
+2
drivers/ieee1394/video1394.c
··· 1503 1503 { 1504 1504 int ret; 1505 1505 1506 + hpsb_init_highlevel(&video1394_highlevel); 1507 + 1506 1508 cdev_init(&video1394_cdev, &video1394_fops); 1507 1509 video1394_cdev.owner = THIS_MODULE; 1508 1510 ret = cdev_add(&video1394_cdev, IEEE1394_VIDEO1394_DEV, 16);