• Bhupesh Sharma's avatar
    [media] V4L/v4l2-dev: Make 'videodev_init' as a subsys initcall · ee981c6f
    Bhupesh Sharma authored
    As the V4L2 based UVC webcam gadget (g_webcam) expects the
    'videodev' to present when the 'webcam_bind' routine is called,
    so 'videodev' should be available as early as possible.
    
    Now, when 'g_webcam' is built as a module (i.e. not a part of
    kernel) the late availability of 'videodev' is OK, but if
    'g_webcam' is built statically as a part of the kernel,
    the kernel crashes (a sample crash dump using Designware 2.0 UDC
    is provided below).
    
    To solve the same, this patch makes 'videodev_init' as a subsys initcall.
    
    Kernel Crash Dump:
    
    ------------------
    
    designware_udc designware_udc: Device Synopsys UDC probed csr 90810000: plug 90812000
    g_webcam gadget: uvc_function_bind
    Unable to handle kernel NULL pointer dereference at virtual address 000000e4
    pgd = 80004000
    [000000e4] *pgd=00000000
    Internal error: Oops: 5 [#1] SMP
    Modules linked in:
    CPU: 0    Not tainted  (3.3.0-rc3-13888-ge774c03-dirty #20)
    PC is at do_raw_spin_lock+0x10/0x16c
    LR is at _raw_spin_lock+0x10/0x14
    pc : [<8019e344>]    lr : [<804095c0>]    psr: 60000013
    sp : 8f839d20  ip : 8f839d50  fp : 8f839d4c
    r10: 80760a94  r9 : 8042de98  r8 : 00000154
    r7 : 80760e94  r6 : 805cfc10  r5 : 8fb6a008  r4 : 8fb6a008
    r3 : 805dd0c8  r2 : 8f839d48  r1 : 805cfc08  r0 : 000000e0
    Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
    Control: 10c5387d  Table: 0000404a  DAC: 00000015
    Process swapper/0 (pid: 1, stack limit = 0x8f8382f0)
    Stack: (0x8f839d20 to 0x8f83a000)
    9d20: ffffffff ffffffff 8fb6a008 8fb6a008 805cfc10 80760e94 00000154 8042de98
    9d40: 8f839d5c 8f839d50 804095c0 8019e340 8f839d7c 8f839d60 80222b28 804095bc
    9d60: 8fb12b80 8fb6a008 8fb6a010 805cfc08 8f839dc4 8f839d80 80223db8 80222adc
    9d80: 8f839dac 8f839d90 8022baa0 8019e2e8 8fb6a008 8075e7f4 8fb6a008 8fb6a008
    9da0: 00000000 8fb6a008 80760e94 00000154 8042de98 80760a94 8f839ddc 8f839dc8
    9dc0: 802242a8 80223d1c 8fb12b80 8fb6a000 8f839e1c 8f839de0 8030132c 80224298
    9de0: 80223ce8 803f2ee8 00000001 804f7750 8f839e1c 8f824008 805cff20 8f824000
    9e00: 8fb6a000 ffffffff 00000000 8f8d4880 8f839e4c 8f839e20 80562e3c 80301100
    9e20: 00000000 8fb13140 8f824008 805cff20 8042aa68 8f824000 8042aa8c 805e4d40
    9e40: 8f839e64 8f839e50 802d20c4 80562ba8 805d0058 805cff20 8f839e8c 8f839e68
    9e60: 80563034 802d206c 8042aa8c 805cff20 8f8d4880 00000000 805cfc08 8fb12a40
    9e80: 8f839e9c 8f839e90 805630c4 80562ec4 8f839ebc 8f839ea0 802d2364 805630b0
    9ea0: 805cfeac 8f8d4880 805cfbe8 807605e8 8f839ed4 8f839ec0 80562b3c 802d22cc
    9ec0: 80562ac4 8f8d4880 8f839f04 8f839ed8 802d0b40 80562ad0 8f839ef4 805cff90
    9ee0: 805cff90 805cfb98 00000000 00000000 805cfbe8 805e4d40 8f839f3c 8f839f08
    9f00: 802cd078 802d0a18 00000000 802d0a0c 00000000 8fb9ba00 802d0a0c 805cff90
    9f20: 00000013 00000000 00000000 805e4d40 8f839f5c 8f839f40 802cf390 802ccff0
    9f40: 00000003 00000003 804fb598 00000000 8f839f74 8f839f60 802d2554 802cf2a0
    9f60: 8f838000 8057731c 8f839f84 8f839f78 80562b90 802d24d0 8f839fdc 8f839f88
    9f80: 800085d4 80562b84 805af2ac 805af2ac 80562b78 00000000 00000013 00000000
    9fa0: 00000000 00000000 8f839fc4 8f839fb8 80043dd0 8057706c 8057731c 8002875c
    9fc0: 00000013 00000000 00000000 00000000 8f839ff4 8f839fe0 805468d4 800085a0
    9fe0: 00000000 80546840 00000000 8f839ff8 8002875c 8054684c 51155555 55545555
    Backtrace:
    [<8019e334>] (do_raw_spin_lock+0x0/0x16c) from [<804095c0>] (_raw_spin_lock+0x10/0x14)
     r9:8042de98 r8:00000154 r7:80760e94 r6:805cfc10 r5:8fb6a008
    r4:8fb6a008
    [<804095b0>] (_raw_spin_lock+0x0/0x14) from [<80222b28>] (get_device_parent+0x58/0x1c0)
    [<80222ad0>] (get_device_parent+0x0/0x1c0) from [<80223db8>] (device_add+0xa8/0x57c)
     r6:805cfc08 r5:8fb6a010 r4:8fb6a008 r3:8fb12b80
    [<80223d10>] (device_add+0x0/0x57c) from [<802242a8>] (device_register+0x1c/0x20)
    [<8022428c>] (device_register+0x0/0x20) from [<8030132c>] (__video_register_device+0x238/0x484)
     r4:8fb6a000 r3:8fb12b80
    [<803010f4>] (__video_register_device+0x0/0x484) from [<80562e3c>] (uvc_function_bind+0x2a0/0x31c)
    [<80562b9c>] (uvc_function_bind+0x0/0x31c) from [<802d20c4>] (usb_add_function+0x64/0x118)
    [<802d2060>] (usb_add_function+0x0/0x118) from [<80563034>] (uvc_bind_config+0x17c/0x1ec)
     r5:805cff20 r4:805d0058
    [<80562eb8>] (uvc_bind_config+0x0/0x1ec) from [<805630c4>] (webcam_config_bind+0x20/0x28)
     r8:8fb12a40 r7:805cfc08 r6:00000000 r5:8f8d4880 r4:805cff20
    r3:8042aa8c
    [<805630a4>] (webcam_config_bind+0x0/0x28) from [<802d2364>] (usb_add_config+0xa4/0x124)
    [<802d22c0>] (usb_add_config+0x0/0x124) from [<80562b3c>] (webcam_bind+0x78/0xb4)
     r6:807605e8 r5:805cfbe8 r4:8f8d4880 r3:805cfeac
    [<80562ac4>] (webcam_bind+0x0/0xb4) from [<802d0b40>] (composite_bind+0x134/0x308)
     r4:8f8d4880 r3:80562ac4
    [<802d0a0c>] (composite_bind+0x0/0x308) from [<802cd078>] (dw_udc_start+0x94/0x2bc)
    [<802ccfe4>] (dw_udc_start+0x0/0x2bc) from [<802cf390>] (usb_gadget_probe_driver+0xfc/0x180)
    [<802cf294>] (usb_gadget_probe_driver+0x0/0x180) from [<802d2554>] (usb_composite_probe+0x90/0xb4)
     r6:00000000 r5:804fb598 r4:00000003 r3:00000003
    [<802d24c4>] (usb_composite_probe+0x0/0xb4) from [<80562b90>] (webcam_init+0x18/0x24)
     r5:8057731c r4:8f838000
    [<80562b78>] (webcam_init+0x0/0x24) from [<800085d4>] (do_one_initcall+0x40/0x184)
    [<80008594>] (do_one_initcall+0x0/0x184) from [<805468d4>] (kernel_init+0x94/0x134)
    [<80546840>] (kernel_init+0x0/0x134) from [<8002875c>] (do_exit+0x0/0x6f8)
     r5:80546840 r4:00000000
    Code: e1a0c00d e92ddbf0 e24cb004 e24dd008 (e5902004)
    ---[ end trace 7ecca37f36fbdc06 ]---
    Signed-off-by: default avatarBhupesh Sharma <bhupesh.sharma@st.com>
    Tested-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
    Acked-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
    ee981c6f
v4l2-dev.c 21.4 KB