• Greg Ungerer's avatar
    spi: imx: fix use of native chip-selects with devicetree · 602c8f44
    Greg Ungerer authored
    The commonly used mechanism of specifying the hardware or native
    chip-select on an SPI device in devicetree (that is "cs-gpios = <0>")
    does not result in the native chip-select being configured for use.
    So external SPI devices that require use of the native chip-select
    will not work.
    
    You can successfully specify native chip-selects if using a platform
    setup by specifying the cs-gpio as negative offset by 32. And that
    works correctly. You cannot use the same method in devicetree.
    
    The logic in the spi-imx.c driver during probe uses core spi function
    of_spi_register_master() in spi.c to parse the "cs-gpios" devicetree tag.
    For valid GPIO values that will be recorded for use, all other entries in
    the cs_gpios list will be set to -ENOENT. So entries like "<0>" will be
    set to -ENOENT in the cs_gpios list.
    
    When the SPI device registers are setup the code will use the GPIO
    listed in the cs_gpios list for the desired chip-select. If the cs_gpio
    is less then 0 then it is intended to be for a native chip-select, and
    its cs_gpio value is added to 32 to get the chipselect number to use.
    Problem is that with devicetree this can only ever be -ENOENT (which
    is -2), and that alone results in an invalid chip-select number. But also
    doesn't allow selection of the native chip-select at all.
    
    To fix, if the cs_gpio specified for this spi device is not a
    valid GPIO then use the "chip_select" (that is the native chip-select
    number) for hardware setup.
    Signed-off-by: default avatarGreg Ungerer <gerg@linux-m68k.org>
    Reviewed-by: default avatarVladimir Zapolskiy <vz@mleia.com>
    Tested-by: default avatarVladimir Zapolskiy <vz@mleia.com>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    602c8f44
spi-imx.c 39 KB