• Geert Uytterhoeven's avatar
    zorro: Defer device_register() until all devices have been identified · a7f4d00a
    Geert Uytterhoeven authored
    As the Amiga Zorro II address space is limited to 8.5 MiB and Zorro
    devices can contain only one BAR, several Amiga Zorro II expansion
    boards (mainly graphics cards) contain multiple Zorro devices: a small
    one for the control registers and one (or more) for the graphics memory.
    
    The conversion of cirrusfb to the new driver framework introduced a
    regression: the driver contains a zorro_driver for the first Zorro
    device, and uses the (old) zorro_find_device() call to find the second
    Zorro device.
    
    However, as the Zorro core calls device_register() as soon as a Zorro
    device is identified, it may not have identified the second Zorro device
    belonging to the same physical Zorro expansion card.  Hence cirrusfb
    could no longer find the second part of the Picasso II graphics card,
    causing a NULL pointer dereference.
    
    Defer the registration of Zorro devices with the driver framework until
    all Zorro devices have been identified to fix this.
    
    Note that the alternative solution (modifying cirrusfb to register a
    zorro_driver for all Zorro devices belonging to a graphics card, instead
    of only for the first one, and adding a synchronization mechanism to
    defer initialization until all have been found), is not an option, as on
    some cards one device may be optional (e.g.  the second bank of 2 MiB of
    graphics memory on the Picasso IV in Zorro II mode).
    Reported-by: default avatarIngo Jürgensmann <ij@2011.bluespice.org>
    Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
    Cc: stable@kernel.org
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a7f4d00a
zorro.c 5.15 KB