1. 29 2月, 2016 16 次提交
  2. 11 2月, 2016 2 次提交
    • A
      mmc: sdhci: Allow override of get_cd() called from sdhci_request() · 8d28b7a7
      Adrian Hunter 提交于
      Drivers may need to provide their own get_cd() mmc host op, but
      currently the internals of the current op (sdhci_get_cd()) are
      provided by sdhci_do_get_cd() which is also called from
      sdhci_request().
      
      To allow override of the get_cd functionality, change sdhci_request()
      to call ->get_cd() instead of sdhci_do_get_cd().
      
      Note, in the future the call to ->get_cd() will likely be removed
      from sdhci_request() since most drivers don't need actually it.
      However this change is being done now to facilitate a subsequent
      bug fix.
      Signed-off-by: NAdrian Hunter <adrian.hunter@intel.com>
      Cc: stable@vger.kernel.org # v4.4+
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      8d28b7a7
    • A
      mmc: sdhci: Allow override of mmc host operations · bf60e592
      Adrian Hunter 提交于
      In the past, fixes for specific hardware devices were implemented
      in sdhci using quirks.  That approach is no longer accepted because
      the growing number of quirks was starting to make the code difficult
      to understand and maintain.
      
      One alternative to quirks, is to allow drivers to override the default
      mmc host operations.  This patch makes it easy to do that, and it is
      needed for a subsequent bug fix, for which separate patches are
      provided.
      Signed-off-by: NAdrian Hunter <adrian.hunter@intel.com>
      Cc: stable@vger.kernel.org # v4.4+
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      bf60e592
  3. 28 12月, 2015 1 次提交
    • J
      mmc: sdhci: restore behavior when setting VDD via external regulator · 918f4cbd
      Jisheng Zhang 提交于
      After commit 52221610 ("mmc: sdhci: Improve external VDD regulator
      support"), for the VDD is supplied via external regulators, we ignore
      the code to convert a VDD voltage request into one of the standard
      SDHCI voltage levels, then program it in the SDHCI_POWER_CONTROL. This
      brings two issues:
      
      1. SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON quirk isn't handled properly any
      more.
      
      2. What's more, once SDHCI_POWER_ON bit is set, some controllers such
      as the sdhci-pxav3 used in marvell berlin SoCs require the voltage
      levels programming in the SDHCI_POWER_CONTROL register, even the VDD
      is supplied by external regulator. So the host in marvell berlin SoCs
      still works fine after the commit. However, commit 3cbc6123 ("mmc:
      sdhci: Set SDHCI_POWER_ON with external vmmc") sets the SDHCI_POWER_ON
      bit, this would make the host in marvell berlin SoCs won't work any
      more with external vmmc.
      
      This patch restores the behavior when setting VDD through external
      regulator by moving the call of mmc_regulator_set_ocr() to the end
      of sdhci_set_power() function.
      
      After this patch, the sdcard on Marvell Berlin SoC boards work again.
      Signed-off-by: NJisheng Zhang <jszhang@marvell.com>
      Fixes: 52221610 ("mmc: sdhci: Improve external VDD ...")
      Reviewed-by: NLudovic Desroches <ludovic.desroches@atmel.com>
      Tested-by: NLudovic Desroches <ludovic.desroches@atmel.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      918f4cbd
  4. 22 12月, 2015 5 次提交
    • A
      mmc: sdhci: Fix sdhci_runtime_pm_bus_on/off() · 5c671c41
      Adrian Hunter 提交于
      sdhci has a legacy facility to prevent runtime suspend if the
      bus power is on.  This is needed in cases where the power to
      the card is dependent on the bus power.  It is controlled by
      a pair of functions: sdhci_runtime_pm_bus_on() and
      sdhci_runtime_pm_bus_off().  These functions use a boolean
      variable 'bus_on' to ensure changes are always paired.
      There is an additional check for 'runtime_suspended' which is
      the problem.  In fact, its use is ill-conceived as the only
      requirement for the logic is that 'on' and 'off' are paired,
      which is actually broken by the check, for example if the bus
      power is turned on during runtime resume.  So remove  the check.
      Signed-off-by: NAdrian Hunter <adrian.hunter@intel.com>
      Cc: stable@vger.kernel.org # v3.11+
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      5c671c41
    • A
      mmc: sdhci: 64-bit DMA actually has 4-byte alignment · 04a5ae6f
      Adrian Hunter 提交于
      The version 3.00 SDHCI spec. was a bit unclear about the
      required data alignment for 64-bit DMA, whereas the version
      4.10 spec. uses different language and indicates that only
      4-byte alignment is required rather than the 8-byte alignment
      currently implemented.  That make no difference to SD and EMMC
      which invariably transfer data in sector-aligned blocks.
      However with SDIO, it results in using more DMA descriptors
      than necessary.  Theoretically that slows DMA slightly although
      DMA is not the limiting factor for throughput, so there is no
      discernable impact on performance.  Nevertheless, the driver
      should follw the spec unless there is good reason not to, so
      this patch corrects the alignment criterion.
      
      There is a more complicated criterion for the DMA descriptor
      table itself.  However the table is allocated by dma_alloc_coherent()
      which allocates pages (i.e. aligned to a page boundary).
      For simplicity just check it is 8-byte aligned, but add a comment
      that some Intel controllers actually require 8-byte alignment
      even when using 32-bit DMA.
      Signed-off-by: NAdrian Hunter <adrian.hunter@intel.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      04a5ae6f
    • A
      mmc: sdhci: Fix DMA descriptor with zero data length · 347ea32d
      Adrian Hunter 提交于
      SDHCI has built-in DMA called ADMA2.  ADMA2 uses a descriptor
      table to define DMA scatter-gather.  Each desciptor can specify
      a data length up to 65536 bytes, however the length field is
      only 16-bits so zero means 65536.  Consequently, putting zero
      when the size is zero must not be allowed.  This patch fixes
      one case where zero data length could be set inadvertently.
      
      The problem happens because unaligned data gets split and the
      code did not consider that the remaining aligned portion might
      be zero length.  That case really only happens for SDIO because
      SD and eMMC cards transfer blocks that are invariably sector-
      aligned.  For SDIO, access to function registers is done by
      data transfer (CMD53) when the register is bigger than 1 byte.
      Generally registers are 4 bytes but 2-byte registers are possible.
      So DMA of 4 bytes or less can happen.  When 32-bit DMA is used,
      the data alignment must be 4, so 4-byte transfers won't casue a
      problem, but a 2-byte transfer could.  However with the introduction
      of 64-bit DMA, the data alignment for 64-bit DMA was made 8 bytes,
      so all 4-byte transfers not on 8-byte boundaries get "split" into
      a 4-byte chunk and a 0-byte chunk, thereby hitting the bug.
      
      In fact, a closer look at the SDHCI specs indicates that only the
      descriptor table requires 8-byte alignment for 64-bit DMA.  That
      will be dealt with in a separate patch, but the potential for a
      2-byte access remains, so this fix is needed anyway.
      Signed-off-by: NAdrian Hunter <adrian.hunter@intel.com>
      Cc: stable@vger.kernel.org # v3.19+
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      347ea32d
    • A
      mmc: sdhci: Do not BUG on invalid vdd · 9d5de93f
      Adrian Hunter 提交于
      The driver may not be able to set the power correctly but that
      is not a reason to BUG().
      Signed-off-by: NAdrian Hunter <adrian.hunter@intel.com>
      Reviewed-by: NVenu Byravarasu <vbyravarasu@nvidia.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      9d5de93f
    • M
      mmc: sdhci: Fix strings broken across multiple lines · 2e4456f0
      Marek Vasut 提交于
      This is a trivial patch which fixes printed strings split across two
      or more lines in the source. I tried to grep for some error output*,
      but I couldn't find it easily because it was broken across multiple
      lines. This patch makes my life easier.
      
      * in particular "Timeout waiting for hardware interrupt."
      Signed-off-by: NMarek Vasut <marex@denx.de>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      2e4456f0
  5. 26 10月, 2015 2 次提交
  6. 09 10月, 2015 1 次提交
  7. 27 8月, 2015 2 次提交
    • J
      mmc: sdhci: also get preset value and driver type for MMC_DDR52 · 0dafa60e
      Jisheng Zhang 提交于
      commit bb8175a8 ("mmc: sdhci: clarify DDR timing mode between
      SD-UHS and eMMC") added MMC_DDR52 as eMMC's DDR mode to be
      distinguished from SD-UHS, but it missed setting driver type for
      MMC_DDR52 timing mode.
      
      So sometimes we get the following error on Marvell BG2Q DMP board:
      
      [    1.559598] mmcblk0: error -84 transferring data, sector 0, nr 8, cmd
      response 0x900, card status 0xb00
      [    1.569314] mmcblk0: retrying using single block read
      [    1.575676] mmcblk0: error -84 transferring data, sector 2, nr 6, cmd
      response 0x900, card status 0x0
      [    1.585202] blk_update_request: I/O error, dev mmcblk0, sector 2
      [    1.591818] mmcblk0: error -84 transferring data, sector 3, nr 5, cmd
      response 0x900, card status 0x0
      [    1.601341] blk_update_request: I/O error, dev mmcblk0, sector 3
      
      This patches fixes this by adding the missing driver type setting.
      
      Fixes: bb8175a8 ("mmc: sdhci: clarify DDR timing mode ...")
      Signed-off-by: NJisheng Zhang <jszhang@marvell.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      0dafa60e
    • H
      mmc: sdhci: fix dma memory leak in sdhci_pre_req() · d31911b9
      Haibo Chen 提交于
      Currently one mrq->data maybe execute dma_map_sg() twice
      when mmc subsystem prepare over one new request, and the
      following log show up:
      	sdhci[sdhci_pre_dma_transfer] invalid cookie: 24, next-cookie 25
      
      In this condition, mrq->date map a dma-memory(1) in sdhci_pre_req
      for the first time, and map another dma-memory(2) in sdhci_prepare_data
      for the second time. But driver only unmap the dma-memory(2), and
      dma-memory(1) never unmapped, which cause the dma memory leak issue.
      
      This patch use another method to map the dma memory for the mrq->data
      which can fix this dma memory leak issue.
      
      Fixes: 348487cb ("mmc: sdhci: use pipeline mmc requests to improve performance")
      Reported-and-tested-by: NJiri Slaby <jslaby@suse.cz>
      Signed-off-by: NHaibo Chen <haibo.chen@freescale.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      d31911b9
  8. 24 8月, 2015 1 次提交
  9. 17 8月, 2015 4 次提交
  10. 24 7月, 2015 2 次提交
  11. 16 6月, 2015 1 次提交
    • J
      mmc: sdhci: fix low memory corruption · 62a7f368
      Jiri Slaby 提交于
      When dma mapping (dma_map_sg) fails in sdhci_pre_dma_transfer, -EINVAL
      is returned. There are 3 callers of sdhci_pre_dma_transfer:
      * sdhci_pre_req and sdhci_adma_table_pre: handle negative return
      * sdhci_prepare_data: handles 0 (error) and "else" (good) only
      
      sdhci_prepare_data is therefore broken. When it receives -EINVAL from
      sdhci_pre_dma_transfer, it assumes 1 sg mapping was mapped. Later,
      this non-existent mapping with address 0 is kmap'ped and written to:
      Corrupted low memory at ffff880000001000 (1000 phys) = 22b7d67df2f6d1cf
      Corrupted low memory at ffff880000001008 (1008 phys) = 63848a5216b7dd95
      Corrupted low memory at ffff880000001010 (1010 phys) = 330eb7ddef39e427
      Corrupted low memory at ffff880000001018 (1018 phys) = 8017ac7295039bda
      Corrupted low memory at ffff880000001020 (1020 phys) = 8ce039eac119074f
      ...
      
      So teach sdhci_prepare_data to understand negative return values from
      sdhci_pre_dma_transfer and disable DMA in that case, as well as for
      zero.
      
      It was introduced in 348487cb (mmc:
      sdhci: use pipeline mmc requests to improve performance). The commit
      seems to be suspicious also by assigning host->sg_count both in
      sdhci_pre_dma_transfer and sdhci_adma_table_pre.
      Signed-off-by: NJiri Slaby <jslaby@suse.cz>
      Cc: stable@vger.kernel.org # 4.0+
      Fixes: 348487cb
      Cc: Ulf Hansson <ulf.hansson@linaro.org>
      Cc: Haibo Chen <haibo.chen@freescale.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      62a7f368
  12. 08 6月, 2015 1 次提交
    • U
      mmc: sdhci: Restore behavior while creating OCR mask · 5fd26c7e
      Ulf Hansson 提交于
      Commit 3a48edc4 ("mmc: sdhci: Use mmc core regulator infrastucture")
      changed the behavior for how to assign the ocr_avail mask for the mmc
      host. More precisely it started to mask the bits instead of assigning
      them.
      
      Restore the behavior, but also make it clear that an OCR mask created
      from an external regulator overrides the other ones. The OCR mask is
      determined by one of the following with this priority:
      
      1. Supported ranges of external regulator if one supplies VDD
      2. Host OCR mask if set by the driver (based on DT properties)
      3. The capabilities reported by the controller itself
      
      Fixes: 3a48edc4 ("mmc: sdhci: Use mmc core regulator infrastucture")
      Cc: Tim Kryger <tim.kryger@gmail.com>
      Reported-by: NYangbo Lu <yangbo.lu@freescale.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Reviewed-by: NTim Kryger <tim.kryger@gmail.com>
      5fd26c7e
  13. 01 6月, 2015 2 次提交