• Antonio Borneo's avatar
    spi: stm32: drop devres version of spi_register_master · 8d559a64
    Antonio Borneo authored
    A call to spi_unregister_master() triggers calling remove()
    for all the spi devices binded to the spi master.
    
    Some spi device driver requires to "talk" with the spi device
    during the remove(), e.g.:
    - a LCD panel like drivers/gpu/drm/panel/panel-lg-lg4573.c
      will turn off the backlighting sending a command over spi.
    This implies that the spi master must be fully functional when
    spi_unregister_master() is called, either if it is called
    explicitly in the master's remove() code or implicitly by the
    devres framework.
    
    Devres calls devres_release_all() to release all the resources
    "after" the remove() of the spi master driver (check code of
    __device_release_driver() in drivers/base/dd.c).
    If the spi master driver has an empty remove() then there would
    be no issue; the devres_release_all() will release everything
    in reverse order w.r.t. probe().
    But if code in spi master driver remove() disables the spi or
    makes it not functional (like in this spi-stm32), then devres
    cannot be used safely for unregistering the spi master and the
    binded spi devices.
    
    Replace devm_spi_register_master() with spi_register_master()
    and add spi_unregister_master() as first action in remove().
    
    Fixes: dcbe0d84 ("spi: add driver for STM32 SPI controller")
    Signed-off-by: default avatarAntonio Borneo <antonio.borneo@foss.st.com>
    Signed-off-by: default avatarAlain Volmat <alain.volmat@foss.st.com>
    Link: https://lore.kernel.org/r/1615545286-5395-1-git-send-email-alain.volmat@foss.st.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    8d559a64
spi-stm32.c 57.9 KB