• Daniel Kurtz's avatar
    spi: When no dma_chan map buffers with spi_master's parent · 88b0aa54
    Daniel Kurtz authored
    Back before commit 1dccb598 ("arm64: simplify dma_get_ops"), for
    arm64, devices for which dma_ops were not explicitly set were automatically
    configured to use swiotlb_dma_ops, since this was hard-coded as the
    global "dma_ops" in arm64_dma_init().
    
    Now that global "dma_ops" has been removed, all devices much have their
    dma_ops explicitly set by a call to arch_setup_dma_ops(), otherwise the
    device is assigned dummy_dma_ops, and thus calls to map_sg for such a
    device will fail (return 0).
    
    Mediatek SPI uses DMA but does not use a dma channel.  Support for this
    was added by commit c37f45b5 ("spi: support spi without dma channel
    to use can_dma()"), which uses the master_spi dev to DMA map buffers.
    
    The master_spi device is not a platform device, rather it is created
    in spi_alloc_device(), and therefore its dma_ops are never set.
    
    Therefore, when the mediatek SPI driver when it does DMA (for large SPI
    transactions > 32 bytes), SPI will use spi_map_buf()->dma_map_sg() to
    map the buffer for use in DMA.  But dma_map_sg()->dma_map_sg_attrs() returns
    0, because ops->map_sg is dummy_dma_ops->__dummy_map_sg, and hence
    spi_map_buf() returns -ENOMEM (-12).
    
    Fix this by using the real spi_master's parent device which should be a
    real physical device with DMA properties.
    Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
    Fixes: c37f45b5 ("spi: support spi without dma channel to use can_dma()")
    Cc: Leilk Liu <leilk.liu@mediatek.com>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    88b0aa54
spi.c 88.1 KB