• G
    MMC: added alternative MMC driver · d4e40dd0
    gellert 提交于
    raspberrypi inclusion
    category: feature
    bugzilla: 50432
    
    --------------------------------
    
    mmc: Disable CMD23 transfers on all cards
    
    Pending wire-level investigation of these types of transfers
    and associated errors on bcm2835-mmc, disable for now. Fallback of
    CMD18/CMD25 transfers will be used automatically by the MMC layer.
    
    Reported/Tested-by: Gellert Weisz <gellert@raspberrypi.org>
    
    mmc: bcm2835-mmc: enable DT support for all architectures
    
    Both ARCH_BCM2835 and ARCH_BCM270x are built with OF now.
    Enable Device Tree support for all architectures.
    Signed-off-by: NNoralf Trønnes <noralf@tronnes.org>
    
    mmc: bcm2835-mmc: fix probe error handling
    
    Probe error handling is broken in several places.
    Simplify error handling by using device managed functions.
    Replace pr_{err,info} with dev_{err,info}.
    Signed-off-by: NNoralf Trønnes <noralf@tronnes.org>
    
    bcm2835-mmc: Add locks when accessing sdhost registers
    
    bcm2835-mmc: Add range of debug options for slowing things down
    
    bcm2835-mmc: Add option to disable some delays
    
    bcm2835-mmc: Add option to disable MMC_QUIRK_BLK_NO_CMD23
    
    bcm2835-mmc: Default to disabling MMC_QUIRK_BLK_NO_CMD23
    
    bcm2835-mmc: Adding overclocking option
    
    Allow a different clock speed to be substitued for a requested 50MHz.
    This option is exposed using the "overclock_50" DT parameter.
    Note that the mmc interface is restricted to EVEN integer divisions of
    250MHz, and the highest sensible option is 63 (250/4 = 62.5), the
    next being 125 (250/2) which is much too high.
    
    Use at your own risk.
    
    bcm2835-mmc: Round up the overclock, so 62 works for 62.5Mhz
    
    Also only warn once for each overclock setting.
    
    mmc: bcm2835-mmc: Make available on ARCH_BCM2835
    
    Make the bcm2835-mmc driver available for use on ARCH_BCM2835.
    Signed-off-by: NNoralf Trønnes <noralf@tronnes.org>
    
    BCM270x_DT: add bcm2835-mmc entry
    
    Add Device Tree entry for bcm2835-mmc.
    In non-DT mode, don't add the device in the board file.
    Signed-off-by: NNoralf Trønnes <noralf@tronnes.org>
    
    bcm2835-mmc: Don't overwrite MMC capabilities from DT
    
    bcm2835-mmc: Don't override bus width capabilities from devicetree
    
    Take out the force setting of the MMC_CAP_4_BIT_DATA host capability
    so that the result read from devicetree via mmc_of_parse() is
    preserved.
    
    bcm2835-mmc: Only claim one DMA channel
    
    With both MMC controllers enabled there are few DMA channels left. The
    bcm2835-mmc driver only uses DMA in one direction at a time, so it
    doesn't need to claim two channels.
    
    See: https://github.com/raspberrypi/linux/issues/1327Signed-off-by: NPhil Elwell <phil@raspberrypi.org>
    
    bcm2835-mmc: New timer API
    
    mmc: bcm2835-mmc: Support underclocking
    
    Support underclocking of the SD bus using the max-frequency DT property
    (which currently has no DT parameter). The sd_overclock parameter
    already provides another way to achieve the same thing which should be
    equivalent in end result, but it is a bug not to support max-frequency
    as well.
    
    See: https://github.com/raspberrypi/linux/issues/2350Signed-off-by: NPhil Elwell <phil@raspberrypi.org>
    
    mmc/bcm2835: Recover from MMC_SEND_EXT_CSD
    
    If the user issues an "mmc extcsd read", the SD controller receives
    what it thinks is a SEND_IF_COND command with an unexpected data block.
    The resulting operations leave the FSM stuck in READWAIT, a state which
    persists until the MMC framework resets the controller, by which point
    the root filesystem is likely to have been unmounted.
    
    A less heavyweight solution is to detect the condition and nudge the
    FSM by asserting the (self-clearing) FORCE_DATA_MODE bit.
    
    N.B. This workaround was essentially discovered by accident and without
    a full understanding the inner workings of the controller, so it is
    fortunate that the "fix" only modifies error paths.
    
    See: https://github.com/raspberrypi/linux/issues/2728Signed-off-by: NPhil Elwell <phil@raspberrypi.org>
    
    bcm2835-mmc: Fix DMA channel leak
    
    The BCM2835 MMC host driver requests a DMA channel on probe but neglects
    to release the channel in the probe error path and on driver unbind.
    
    I'm seeing this happen on every boot of the Compute Module 3: On first
    driver probe, DMA channel 2 is allocated and then leaked with a "could
    not get clk, deferring probe" message. On second driver probe, channel 4
    is allocated.
    
    Fix it.
    Signed-off-by: NLukas Wunner <lukas@wunner.de>
    Cc: Frank Pavlic <f.pavlic@kunbus.de>
    
    bcm2835-mmc: Fix struct mmc_host leak on probe
    
    The BCM2835 MMC host driver requests the bus address of the host's
    register map on probe.  If that fails, the driver leaks the struct
    mmc_host allocated earlier.
    
    Fix it.
    Signed-off-by: NLukas Wunner <lukas@wunner.de>
    Cc: Frank Pavlic <f.pavlic@kunbus.de>
    
    bcm2835-mmc: Fix duplicate free_irq() on remove
    
    The BCM2835 MMC host driver requests its interrupt as a device-managed
    resource, so the interrupt is automatically freed after the driver is
    unbound.
    
    However on driver unbind, bcm2835_mmc_remove() frees the interrupt
    explicitly to avoid invocation of the interrupt handler after driver
    structures have been torn down.
    
    The interrupt is thus freed twice, leading to a WARN splat in
    __free_irq().  Fix by not requesting the interrupt as a device-managed
    resource.
    Signed-off-by: NLukas Wunner <lukas@wunner.de>
    Cc: Frank Pavlic <f.pavlic@kunbus.de>
    
    bcm2835-mmc: Handle mmc_add_host() errors
    
    The BCM2835 MMC host driver calls mmc_add_host() but doesn't check its
    return value.  Errors occurring in that function are therefore not
    handled.  Fix it.
    Signed-off-by: NLukas Wunner <lukas@wunner.de>
    Cc: Frank Pavlic <f.pavlic@kunbus.de>
    
    bcm2835-mmc: Deduplicate reset of driver data on remove
    
    The BCM2835 MMC host driver sets the device's driver data pointer to
    NULL on ->remove() even though the driver core subsequently does the
    same in __device_release_driver().  Drop the duplicate assignment.
    Signed-off-by: NLukas Wunner <lukas@wunner.de>
    Cc: Frank Pavlic <f.pavlic@kunbus.de>
    
    bcm2835_mmc: Remove vestigial threaded IRQ
    
    With SDIO processing now managed by the MMC framework with a
    workqueue, the bcm2835_mmc driver no longer needs a threaded
    IRQ.
    Signed-off-by: NPhil Elwell <phil@raspberrypi.org>
    
    Add missing dma_unmap_sg calls to free relevant swiotlb bounce buffers.
    This prevents DMA leaks.
    Signed-off-by: NYaroslav Rosomakho <yaroslavros@gmail.com>
    
    Limit max_req_size under arm64 (or any other platform that uses swiotlb) to prevent potential buffer overflow due to bouncing.
    Signed-off-by: NYaroslav Rosomakho <yaroslavros@gmail.com>
    Signed-off-by: NFang Yafen <yafen@iscas.ac.cn>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    d4e40dd0
card.h 11.1 KB