linux.git
7 years agommc: mmc: Add functions to enable / disable the Command Queue
Adrian Hunter [Mon, 13 Mar 2017 12:36:37 +0000 (14:36 +0200)]
mmc: mmc: Add functions to enable / disable the Command Queue

Add helper functions to enable or disable the Command Queue.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit b658af718465cd1e8011c8da281befdfc2debefd)

7 years agommc: queue: Share mmc request array between partitions
Adrian Hunter [Mon, 13 Mar 2017 12:36:36 +0000 (14:36 +0200)]
mmc: queue: Share mmc request array between partitions

eMMC can have multiple internal partitions that are represented as separate
disks / queues. However switching between partitions is only done when the
queue is empty. Consequently the array of mmc requests that are queued can
be shared between partitions saving memory.

Keep a pointer to the mmc request queue on the card, and use that instead
of allocating a new one for each partition.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 7b410d074b253a44624497a18e73f666a9574f37)

7 years agommc: block: Introduce queue semantics
Adrian Hunter [Mon, 13 Mar 2017 12:36:35 +0000 (14:36 +0200)]
mmc: block: Introduce queue semantics

Change from viewing the requests in progress as 'current' and 'previous',
to viewing them as a queue. The current request is allocated to the first
free slot. The presence of incomplete requests is determined from the
count (mq->qcnt) of entries in the queue. Non-read-write requests (i.e.
discards and flushes) are not added to the queue at all and require no
special handling. Also no special handling is needed for the
MMC_BLK_NEW_REQUEST case.

As well as allowing an arbitrarily sized queue, the queue thread function
is significantly simpler.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit cdf8a6fb48882651049e468e6b16956fb83db86c)

7 years agommc: block: Use local var for mqrq_cur
Adrian Hunter [Mon, 13 Mar 2017 12:36:34 +0000 (14:36 +0200)]
mmc: block: Use local var for mqrq_cur

A subsequent patch will remove 'mq->mqrq_cur'. Prepare for that by
assigning it to a local variable.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 8ddfe07e18c9c82f7567d3cfbd68d8b59764d015)

7 years agommc: use new core function mmc_get_dma_dir
Heiner Kallweit [Sun, 26 Mar 2017 18:45:56 +0000 (20:45 +0200)]
mmc: use new core function mmc_get_dma_dir

Use new core function mmc_get_dma_dir().

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit feeef096a770d288c943c1759785bd9d4f9247b7)

Conflicts:
drivers/mmc/host/dw_mmc.c

7 years agommc: core: add mmc_get_dma_dir
Heiner Kallweit [Sun, 26 Mar 2017 18:41:32 +0000 (20:41 +0200)]
mmc: core: add mmc_get_dma_dir

Add function for determining DMA direction to core.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 6335d68349a85382cc55a5260d5bfda85f8e24a8)

7 years agommc: sdhci: clarify the get_timeout_clock callback
Shawn Lin [Fri, 24 Mar 2017 07:50:12 +0000 (15:50 +0800)]
mmc: sdhci: clarify the get_timeout_clock callback

Currently the get_timeout_clock callback doesn't clearly
have a statement that it needs the variant drivers to return
the timeout clock rate in kHz if the SDHCI_TIMEOUT_CLK_UNIT
isn't present, otherwise the variant drivers should return it
in MHz. It's also very likely that further variant drivers which
are going to use this callback will be confused by this situation.
Given the fact that moderm sdhci variant hosts are very prone to get
the timeout clock from common clock framework (actually the only three
users did that), it's more natural to return the value in Hz and we
make an explicit comment there. Then we put the unit conversion inside
the sdhci core. Thus will improve the code and prevent further misuses.

Reported-by: Anssi Hannula <anssi.hannula@bitwise.fi>
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Acked-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 8cc35289227c5cbb8811048519c1703e2137d421)

Conflicts:
drivers/mmc/host/sdhci-cadence.c
drivers/mmc/host/sdhci-of-arasan.c

7 years agommc: sdio: improve mmc_io_rw_extended
Heiner Kallweit [Wed, 22 Mar 2017 20:59:29 +0000 (21:59 +0100)]
mmc: sdio: improve mmc_io_rw_extended

Improve mmc_io_rw_extended a little:
- using DIV_ROUND_UP achieves the same but is better readable
- simplify code by using sg_set_buf
- simplify one statement by using -= operator

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 7aceaf566e1d6f7bf29516d680ee883697909cc7)

7 years agommc: sdhci: Add CQE support
Adrian Hunter [Mon, 20 Mar 2017 17:50:47 +0000 (19:50 +0200)]
mmc: sdhci: Add CQE support

Add an interrupt hook and helper functions for enabling, disabling and
delivering interrupts to a CQE.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit f12e39dbf3e6eb521435085712addc131d803bfd)

7 years agommc: sdhci: Factor out sdhci_set_default_irqs
Adrian Hunter [Mon, 20 Mar 2017 17:50:46 +0000 (19:50 +0200)]
mmc: sdhci: Factor out sdhci_set_default_irqs

Factor out sdhci_set_default_irqs().

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit f5c1ab821b96419261e7676efb1a355e9d735faf)

7 years agommc: sdhci: Add sdhci_cleanup_host
Adrian Hunter [Mon, 20 Mar 2017 17:50:45 +0000 (19:50 +0200)]
mmc: sdhci: Add sdhci_cleanup_host

Add sdhci_cleanup_host() to cleanup __sdhci_add_host().

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit 4180ffa81779551a25772efae1128ac5a9689536)

7 years agommc: sdhci: Get rid of 'extern' in header file
Adrian Hunter [Mon, 20 Mar 2017 17:50:44 +0000 (19:50 +0200)]
mmc: sdhci: Get rid of 'extern' in header file

Get rid of unnecessary 'extern' in header file.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit 15becf68b86741be282880196f1e5155b1a9a033)

7 years agommc: sdhci: Export sdhci_dumpregs
Adrian Hunter [Mon, 20 Mar 2017 17:50:43 +0000 (19:50 +0200)]
mmc: sdhci: Export sdhci_dumpregs

Export sdhci_dumpregs so that it can be called by drivers.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit d28981727dccd0e1e867deceaa709bc89f1a5ebc)

7 years agommc: sdhci: Improve register dump print format
Adrian Hunter [Mon, 20 Mar 2017 17:50:42 +0000 (19:50 +0200)]
mmc: sdhci: Improve register dump print format

Ensure all prints start with the mmc host name, and the text all lines up.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit 85ad90e2f819a5c7f5d1005da32660eff7680abf)

7 years agommc: sdhci: Use sdhci_readl() not readl() in sdhci_dumpregs()
Adrian Hunter [Mon, 20 Mar 2017 17:50:41 +0000 (19:50 +0200)]
mmc: sdhci: Use sdhci_readl() not readl() in sdhci_dumpregs()

Use sdhci io wrappers consistently.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit c71024de98f4b596112be9c2698b2d8000382a5a)

7 years agommc: sdhci: Add response register to register dump
Adrian Hunter [Mon, 20 Mar 2017 17:50:40 +0000 (19:50 +0200)]
mmc: sdhci: Add response register to register dump

Add response register to register dump.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit 7962302fc3f5b3b31523b518a2dc47849fb7bd06)

7 years agommc: sdhci: Improve debug print format
Adrian Hunter [Mon, 20 Mar 2017 17:50:39 +0000 (19:50 +0200)]
mmc: sdhci: Improve debug print format

Ensure all debug prints start with the mmc host name.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit f421865d5b4ce57013040fb1700edceb43a14b42)

7 years agommc: sdhci: Reduce spin lock usage in sdhci_execute_tuning
Adrian Hunter [Mon, 20 Mar 2017 17:50:38 +0000 (19:50 +0200)]
mmc: sdhci: Reduce spin lock usage in sdhci_execute_tuning

Tuning execution is already synchronized with respect to other host
operations by upper layers "claiming" the host, which also takes care of
runtime pm. There can be no requests in progress. Retain the spin lock
usage only for ensuring that sending tuning commands is synchronized with
respect to the interrupt handler.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit 2a85ef25bee6910f4de510c5b574c81e87f38b05)

7 years agommc: sdhci: Remove ->select_drive_strength() callback
Adrian Hunter [Mon, 20 Mar 2017 17:50:36 +0000 (19:50 +0200)]
mmc: sdhci: Remove ->select_drive_strength() callback

Drivers can use the host operation directly, so remove this now unused
callback.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit 0c62e6752d0c769aae41bfade6258e5f9aedbe2d)

Conflicts:
drivers/mmc/host/sdhci-pci.h

7 years agommc: sdhci: Let drivers decide whether to use mmc_retune_needed() with pm
Adrian Hunter [Mon, 20 Mar 2017 17:50:32 +0000 (19:50 +0200)]
mmc: sdhci: Let drivers decide whether to use mmc_retune_needed() with pm

Devices might save and restore tuning values so that re-tuning might not be
needed after a pm transition.  Let drivers decide by pushing the
mmc_retune_needed() logic down to them.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit d38dcad4e7b48f3d68d5d058f8f4f52a99862e6e)

Conflicts:
drivers/mmc/host/sdhci-esdhc-imx.c
drivers/mmc/host/sdhci-pltfm.c

7 years agommc: sdhci: Optimize delay loops
Adrian Hunter [Mon, 20 Mar 2017 17:50:31 +0000 (19:50 +0200)]
mmc: sdhci: Optimize delay loops

The delay loops for reset and clock enable always take at least 1 ms
because they use mdelay(1). However they can take a lot less time e.g. less
than 50us. Use ktime and reduce the delay to 10 microseconds per loop.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
(cherry picked from commit 5a436cc0af6202265de0d2d2d35f1b4fd85caf3b)

7 years agommc: core: simplify return code
tcharding [Wed, 15 Mar 2017 08:48:04 +0000 (19:48 +1100)]
mmc: core: simplify return code

File contains multiple functions doing variations on the same thing,
sdio_readb(), sdio_writeb()f, sdio_readw(), sdio_writew()
etc. Although the functions have very similar logic the code is laid
out in a variety of ways. This makes it overly complicated to
read. There is a already a nice clean chunk of code, if we use this
format for all instances then we will have cleaned up the code,
reduced the line count and lessened the cognitive load required while
reading. Less lines equals less bugs.

Pick the most simple and clear code flow and change all functions to
be the same.

Signed-off-by: Tobin C. Harding <me@tobin.cc>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 8e11b284eaa86863f700216e4d3c87e7d7b3f44c)

7 years agommc: core: guard dereference of optional parameter
tcharding [Wed, 15 Mar 2017 08:48:03 +0000 (19:48 +1100)]
mmc: core: guard dereference of optional parameter

Various functions take as parameter an optional pointer. Pointer
should be guarded with non-NULL check before dereferencing.

Add non-NULL check before dereference of pointer.

Signed-off-by: Tobin C. Harding <me@tobin.cc>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 9b980d950e5bcdce6dbc15a9c00ff960beeea28b)

7 years agommc: core: mmc_blk_rw_cmd_err - remove unused variable
Winkler, Tomas [Thu, 9 Mar 2017 14:58:21 +0000 (16:58 +0200)]
mmc: core: mmc_blk_rw_cmd_err - remove unused variable

Fix compilation warning:

drivers/mmc/core/block.c:1563:24: warning: variable ‘mq_rq’ set but not
used [-Wunused-but-set-variable]  struct mmc_queue_req *mq_rq;

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 8bcd37d8b21de13d068414c018c9599281294a01)

7 years agommc: block: Fix cmd error reset failure path
Adrian Hunter [Mon, 13 Mar 2017 12:36:33 +0000 (14:36 +0200)]
mmc: block: Fix cmd error reset failure path

Commit 4e1f780032c5 ("mmc: block: break out mmc_blk_rw_cmd_abort()")
assumed the request had not completed, but in one case it had. Fix that.

Fixes: 4e1f780032c5 ("mmc: block: break out mmc_blk_rw_cmd_abort()")
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 8ecc34448e24e9e8a8f3a9b37be70b43c6af5288)

7 years agommc: block: Fix is_waiting_last_req set incorrectly
Adrian Hunter [Mon, 13 Mar 2017 12:36:32 +0000 (14:36 +0200)]
mmc: block: Fix is_waiting_last_req set incorrectly

Commit 15520111500c ("mmc: core: Further fix thread wake-up") allowed a
queue to release the host with is_waiting_last_req set to true. A queue
waiting to claim the host will not reset it, which can result in the
queue getting stuck in a loop.

Fixes: 15520111500c ("mmc: core: Further fix thread wake-up")
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: stable@vger.kernel.org # v4.10+
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 2602b740e45cc64feb55d5a9ee8db744ab3becbb)

7 years agommc: core: add mmc prefix for blk_fixups
Shawn Lin [Wed, 15 Feb 2017 08:36:47 +0000 (16:36 +0800)]
mmc: core: add mmc prefix for blk_fixups

That makes all the quirks table look more consistent.

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 8c7cdbf9272c300dc093da3c62fa3b4bc6dc960e)

7 years agommc: core: move all quirks together into quirks.h
Shawn Lin [Wed, 15 Feb 2017 08:35:31 +0000 (16:35 +0800)]
mmc: core: move all quirks together into quirks.h

It's not appreciated to place quirks everywhere, let's
put them together just like what we do for USB, PCI etc.

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 0e9cfcf44e4aced8d45f409dcb48a0994fa77979)

7 years agommc: core: improve the quirks for sdio devices
Shawn Lin [Wed, 15 Feb 2017 08:35:30 +0000 (16:35 +0800)]
mmc: core: improve the quirks for sdio devices

Rename mmc_fixup_methods to sdio_fixup_methods to better
reflect that it's for sdio devices. So we could also pass
on it from sdio card's probe sequence just like what we do
for eMMC and block there.

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 1144c1e4ddab9339e262e2702744e8f5c6220824)

7 years agommc: core: move some sdio IDs out of quirks file
Shawn Lin [Wed, 15 Feb 2017 08:35:29 +0000 (16:35 +0800)]
mmc: core: move some sdio IDs out of quirks file

Consolidate all the sdio devices' IDs into sdio_ids.

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 884f38607897cb4a963ea8a65296f0973a2828d0)

7 years agommc: core: change quirks.c to be a header file
Shawn Lin [Wed, 15 Feb 2017 08:35:28 +0000 (16:35 +0800)]
mmc: core: change quirks.c to be a header file

Rename quirks.c to quirks.h, and include it for
individual C files which need it.

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 28fc64af63488d701184977481b263f31d856984)

7 years agommc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support
Uri Yanai [Tue, 7 Feb 2017 16:00:01 +0000 (18:00 +0200)]
mmc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support

Adding dedicated flag for AUTO_BKOPS in card->ext_csd structure.
Read AUTO_BKOPS bit value from the device EXT_CSD and set to the
card->ext_csd structure.
In mmc_decode_ext_csd() add a print message in case the AUTO_BKOPS
is enabled

Signed-off-by: Uri Yanai <uri.yanai@sandisk.com>
Signed-off-by: Alex Lemberg <alex.lemberg@sandisk.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit efff8e7879b8b7f8a077f495262f0bb9cfaa0b06)

7 years agommc: MAN_BKOPS_EN inverse debug message logic
Uri Yanai [Tue, 7 Feb 2017 16:00:00 +0000 (18:00 +0200)]
mmc: MAN_BKOPS_EN inverse debug message logic

Inverse the logic for printing the debug message.
In mmc_decode_ext_csd() print message when MAN_BKOPS_EN is set

Signed-off-by: Uri Yanai <uri.yanai@sandisk.com>
Signed-off-by: Alex Lemberg <alex.lemberg@sandisk.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 6962c2fb201878722ef78b513dae7c22dfa4919c)

7 years agommc: core: start to break apart mmc_start_areq()
Linus Walleij [Wed, 1 Feb 2017 12:48:00 +0000 (13:48 +0100)]
mmc: core: start to break apart mmc_start_areq()

This function is doing to many clever things at the same time under
too many various conditions.

Start to make things clearer by refactoring: break out the
finalization of the previous asynchronous request to its own
function mmc_finalize_areq(). We can get rid of the default
assignment of status and let the call deal with this.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 37dac0681e2be4f3c32b090a8c0591d4ce57e6f0)

7 years agommc: block: respect bool returned from blk_end_request()
Linus Walleij [Wed, 1 Feb 2017 12:47:58 +0000 (13:47 +0100)]
mmc: block: respect bool returned from blk_end_request()

The return value from blk_end_request() is a bool but is
treated like an int. This is generally safe, but the variable
also has the opaque name "ret" and gets returned from the
helper function mmc_blk_cmd_err().

- Switch the variable to a bool, applies everywhere.

- Return a bool from mmc_blk_cmd_err() and rename the function
  mmc_blk_rw_cmd_err() to indicate through the namespace that
  this is a helper for mmc_blk_issue_rw_rq().

- Rename the variable from "ret" to "req_pending" inside the
  while() loop inside mmc_blk_issue_rq_rq(), which finally
  makes it very clear what this while loop is waiting for.

- Augment the argument "ret" to mmc_blk_rq_cmd_err() to
  old_req_pending so it becomes evident that this is an
  older state, and it is returned only if we fail to get
  the number of written blocks from an SD card in the
  function mmc_sd_num_wr_blocks().

- Augment the while() loop in mmc_blk_rq_cmd_abort(): it
  is evident now that we know this is a bool variable,
  that the function is just spinning waiting for
  blk_end_request() to return false.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 0e65f10cf1774a27acf9e933e006f1e55a4ef642)

7 years agommc: block: return errorcode from mmc_sd_num_wr_blocks()
Linus Walleij [Wed, 1 Feb 2017 12:47:57 +0000 (13:47 +0100)]
mmc: block: return errorcode from mmc_sd_num_wr_blocks()

mmc_sd_num_wr_blocks() has an interesting construction that
saves one return argument by casting (u32)-1 as error code
if something goes wrong.

This is however a bit confusing when the normal kernel
pattern is to return an int error code on success.

So instead pass a variable "blocks" that the function can
fill in with the number of successfully transferred blocks
and return an integer as error code.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
[Ulf: Changed a return code to -EIO, reported by Dan Carpenter and fixed
by Linus Walleij]

(cherry picked from commit 169f03a064c230de6d715bdd62112eb12256fce3)

7 years agommc: queue: turn queue flags into bools
Linus Walleij [Wed, 1 Feb 2017 12:47:56 +0000 (13:47 +0100)]
mmc: queue: turn queue flags into bools

Instead of masking and setting two bits in the "flags" field
for the mmc_queue, just use two bools named "suspended" and
"new_request".

The masking and setting would likely have race conditions
anyways, it is better to use a simple member like this.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 9491be5ff06ff08d61e6a8d767382ea0037a6f38)

7 years agommc: block: rename mmc_active to areq
Linus Walleij [Wed, 1 Feb 2017 12:47:55 +0000 (13:47 +0100)]
mmc: block: rename mmc_active to areq

The mmc_active member of struct mmc_queue_req has a very
confusing name: this is certainly not always "active", it is
the asynchronous request associated by the mmc_queue_req
but it is not guaranteed to be "active" in any sense, such
as being running on the host.

Simply rename this member to "areq".

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 74f5ba357c7cd63c664e65fb7a116dbc0538a2ec)

7 years agommc: block: refactor mmc_blk_rw_try_restart()
Linus Walleij [Wed, 1 Feb 2017 12:47:54 +0000 (13:47 +0100)]
mmc: block: refactor mmc_blk_rw_try_restart()

The mmc_blk_rw_start_new() was named after the label inside
mmc_blk_issue_rw_rq() but is really a confusing name for this
function: what it does is to try to restart the latest issued
command on the host and card of the current MMC queue.

So rename it mmc_blk_rw_try_restart() that reflects what it
is doing and at this point also refactore the function to
treat the removed card as an exception and just exit if this
happens and run on in the function if that is not happening.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit b2928e1049e1d96ac794293d18168c721dbfdb24)

7 years agommc: core: rename mmc_start_req() to *areq()
Linus Walleij [Wed, 1 Feb 2017 12:47:53 +0000 (13:47 +0100)]
mmc: core: rename mmc_start_req() to *areq()

With the coexisting __mmc_start_request(), mmc_start_request()
and __mmc_start_req() it is a bit confusing that mmc_start_req()
actually does not start a normal request, but an asynchronous
request.

Rename it to mmc_start_areq() to make it explicit what the
function is doing, also fix the kerneldoc for this function
while we're at it.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit c3399ef55d8e8295293808eba32e3f7056526324)

7 years agommc: block: rename rqc and req
Linus Walleij [Wed, 1 Feb 2017 12:47:52 +0000 (13:47 +0100)]
mmc: block: rename rqc and req

In the function mmc_blk_issue_rw_rq() the new request coming in
from the block layer is called "rqc" and the old request that
was potentially just returned back from the asynchronous
mechanism is called "req".

This is really confusing when trying to analyze and understand
the code, it becomes a perceptual nightmare to me. Maybe others
have better parserheads but it is not working for me.

Rename "rqc" to "new_req" and "req" to "old_req" to reflect what
is semantically going on into the syntax.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit acd8dbd64a2adcd950c31261247cda6f847f57eb)

7 years agommc: block: inline the command abort and start new goto:s
Linus Walleij [Wed, 1 Feb 2017 12:47:51 +0000 (13:47 +0100)]
mmc: block: inline the command abort and start new goto:s

The goto statements sprinkled over the mmc_blk_issue_rw_rq()
function has grown over the years and makes the code pretty hard
to read.

Inline the calls such that:

goto cmd_abort; ->
mmc_blk_rw_cmd_abort(card, req);
mmc_blk_rw_start_new(mq, card, rqc);
return;

goto start_new_req; ->
mmc_blk_rw_start_new(mq, card, rqc);
return;

After this it is more clear how we exit the do {} while
loop in this function, and it gets possible to split the
code apart.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit db435505b561c1ca7b72c646dbc060f0c674360c)

7 years agommc: core/mmci: restore pre/post_req behaviour
Linus Walleij [Fri, 27 Jan 2017 14:04:54 +0000 (15:04 +0100)]
mmc: core/mmci: restore pre/post_req behaviour

commit 64b12a68a9f74bb32d8efd7af1ad8a2ba02fc884
"mmc: core: fix prepared requests while doing bkops"
is fixing a bug in the wrong way. A bug in the MMCI
device driver is fixed by amending the MMC core.

Thinking about it: what the pre- and post-callbacks
are doing is to essentially map and unmap SG lists
for DMA transfers. Why would we not be able to do that
just because a BKOPS command is sent inbetween?
Having to unprepare/prepare the next asynchronous
request for DMA seems wrong.

Looking the backtrace in that commit we can see what
the real problem actually is:

mmci_data_irq() is calling mmci_dma_unmap() twice
which is goung to call arm_dma_unmap_sg() twice
and v7_dma_inv_range() twice for the same sglist
and that will crash.

This happens because a request is prepared, then
a BKOPS is sent. The IRQ completing the BKOPS command
goes through mmci_data_irq() and thinks that a DMA
operation has just been completed because
dma_inprogress() reports true. It then proceeds to
unmap the sglist.

But that was wrong! dma_inprogress() should NOT be
true because no DMA was actually in progress! We had
just prepared the sglist, and the DMA channel
dma_current has been configured, but NOT started!

Because of this, the sglist is already unmapped when
we get our actual data completion IRQ, and we are
unmapping the sglist once more, and we get this crash.

Therefore, we need to revert this solution pushing
the problem to the core and causing problems, and
instead augment the implementation such that
dma_inprogress() only reports true if some DMA has
actually been started.

After this we can keep the request prepared during the
BKOPS and we need not unprepare/reprepare it.

Fixes: 64b12a68a9f7 ("mmc: core: fix prepared requests while doing bkops")
Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Tested-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit e13934bdf45935f51243515c275629922dc43839)

7 years agommc: core: Extend mmc_of_parse() to check for mmc-ddr-3_3v
Ulf Hansson [Wed, 25 Jan 2017 11:45:43 +0000 (12:45 +0100)]
mmc: core: Extend mmc_of_parse() to check for mmc-ddr-3_3v

When mmc_of_parse() finds the binding, it sets the mmc cap,
MMC_CAP_3_3V_DDR, which informs the core whether eMMC DDR at 3.3V I/O is
supported by the mmc host.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Tested-by: Jan Glauber <jglauber@cavium.com>
Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
(cherry picked from commit fb00f196fcce8078e162d09a1d7725032c2dfdc8)

Conflicts:
drivers/mmc/core/host.c

7 years agommc: dt: Document binding for eMMC DDR 3.3V I/O voltage support
Ulf Hansson [Wed, 25 Jan 2017 11:44:13 +0000 (12:44 +0100)]
mmc: dt: Document binding for eMMC DDR 3.3V I/O voltage support

Cc: <devicetree@vger.kernel.org>
Cc: Rob Herring <robh@kernel.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Tested-by: Jan Glauber <jglauber@cavium.com>
Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
Acked-by: Rob Herring <robh@kernel.org>
(cherry picked from commit 41efc76e0c0414d1e38a9d974a544aa80a653956)

7 years agommc: core: Invent MMC_CAP_3_3V_DDR
Ulf Hansson [Wed, 25 Jan 2017 11:04:17 +0000 (12:04 +0100)]
mmc: core: Invent MMC_CAP_3_3V_DDR

According the JEDEC specification an eMMC card supporting 1.8V vccq in DDR
mode should also be capable of 3.3V. However, it's been reported that some
mmc hosts supports 3.3V, but not 1.8V.

Currently the mmc core implements an error handling when the host fails to
set 1.8V for vccq, by falling back to 3.3V. Unfortunate, this seems to be
insufficient for some mmc hosts. To enable these to use eMMC DDR mode let's
invent a new mmc cap, MMC_CAP_3_3V_DDR, which tells whether they support
the eMMC 3.3V DDR mode.

In case MMC_CAP_3_3V_DDR is set, but not MMC_CAP_1_8V_DDR, let's change to
remain on the 3.3V, as it's the default voltage level for vccq, set by the
earlier power up sequence.

As this change introduces MMC_CAP_3_3V_DDR, let's take the opportunity to
do some re-formatting of the related defines in the header file.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Tested-by: Jan Glauber <jglauber@cavium.com>
Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
(cherry picked from commit 20f921bb01140207983e9fc3af4bb60f1f9fc0d5)

7 years agommc: core: Rename __mmc_set_signal_voltage() to mmc_set_signal_voltage()
Ulf Hansson [Wed, 25 Jan 2017 10:12:34 +0000 (11:12 +0100)]
mmc: core: Rename __mmc_set_signal_voltage() to mmc_set_signal_voltage()

Earlier the mmc_set_signal_voltage() existed, but since it has been renamed
to mmc_set_uhs_voltage(), we can now use that name instead.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Tested-by: Jan Glauber <jglauber@cavium.com>
Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
(cherry picked from commit 4e74b6b3c6e9adfe6a8fdebfc56a6416a996d905)

7 years agommc: core: Clarify usage of mmc_set_signal_voltage()
Ulf Hansson [Wed, 25 Jan 2017 09:25:01 +0000 (10:25 +0100)]
mmc: core: Clarify usage of mmc_set_signal_voltage()

The mmc_set_signal_voltage() function is used for SD/SDIO when switching to
1.8V for UHS mode. To clarify this let's do the following changes.

- We are always providing MMC_SIGNAL_VOLTAGE_180 as the signal_voltage
  parameter to the function. Then, let's just remove the parameter as it
  serves no purpose.
- Rename the function to mmc_set_uhs_voltage().

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Tested-by: Jan Glauber <jglauber@cavium.com>
Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
(cherry picked from commit 2ed573b603f78289dd1435c94597aa25a97e2b76)

7 years agommc: core: Remove redundant code in mmc_set_signal_voltage()
Ulf Hansson [Wed, 25 Jan 2017 09:12:10 +0000 (10:12 +0100)]
mmc: core: Remove redundant code in mmc_set_signal_voltage()

The mmc_set_signal_voltage() function is used for SD/SDIO when switching to
1.8V for UHS mode. Therefore let's remove the redundant code dealing with
MMC_SIGNAL_VOLTAGE_330.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Tested-by: Jan Glauber <jglauber@cavium.com>
Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
(cherry picked from commit a44efa4796249c6d4341935e90e9105d6e1a5f15)

7 years agommc: block: stop passing around pointless return values
Linus Walleij [Tue, 24 Jan 2017 10:17:57 +0000 (11:17 +0100)]
mmc: block: stop passing around pointless return values

The mmc_blk_issue_rq() function is called in exactly one place
in queue.c and there the return value is ignored. So the
functions called from that function that also meticulously
return 0/1 do so for no good reason.

Error reporting on the asynchronous requests are done upward to
the block layer when the requests are eventually completed or
fail, which may happen during the flow of the mmc_blk_issue_*
functions directly (for "special commands") or later, when an
asynchronous read/write request is completed.

The issuing functions do not give rise to errors on their own,
and there is nothing to return back to the caller in queue.c.
Drop all return values and make the function return void.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit df0615889651321712b0b429780617d35c1ed963)

7 years agommc: block: introduce new_areq and old_areq
Linus Walleij [Tue, 24 Jan 2017 10:17:56 +0000 (11:17 +0100)]
mmc: block: introduce new_areq and old_areq

Recycling the same variable in an x=x+1 fashion may seem
clever here but it makes the code terse and hard to follow
for humans. Introduce a new_areq and old_areq variable so
we see what is going on.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 7d552a48089b6a24b65abe9c49a184bae8364abe)

7 years agommc: block: inline command abortions
Linus Walleij [Tue, 24 Jan 2017 10:17:55 +0000 (11:17 +0100)]
mmc: block: inline command abortions

Setting rqc to NULL followed by a goto to cmd_abort is just a way
to do unconditional abort without starting any new command.
Inline the calls to mmc_blk_rw_cmd_abort() and return immediately
in those cases.

Add some comments to the code flow so it is clear that this is
where the asynchronous requests come back in and the result of
them gets handled.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit da0dbaffe354043bb0cd61c00c650c819d104b29)

7 years agommc: block: do not assign mq_rq when aborting command
Linus Walleij [Tue, 24 Jan 2017 10:17:54 +0000 (11:17 +0100)]
mmc: block: do not assign mq_rq when aborting command

The code in mmc_blk_issue_rq_rq() aborts a command if the request
is not properly aligned on large sectors. As part of the path
jumping out, it assigns the local variable mq_rq reflecting
a MMC queue request to the current MMC queue request, which is
confusing since the variable is not used after this jump.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 6fb85d658308952142da6abb4e066dd22dd48c01)

7 years agommc: block: break out mmc_blk_rw_start_new()
Linus Walleij [Tue, 24 Jan 2017 10:17:53 +0000 (11:17 +0100)]
mmc: block: break out mmc_blk_rw_start_new()

As a step toward breaking apart the very complex function
mmc_blk_issue_rw_rq() we break out the code to start a new
request.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit efb5a05e70dfa79fe26133be9a239cbca8ea08c3)

7 years agommc: block: break out mmc_blk_rw_cmd_abort()
Linus Walleij [Tue, 24 Jan 2017 10:17:52 +0000 (11:17 +0100)]
mmc: block: break out mmc_blk_rw_cmd_abort()

As a first step toward breaking apart the very complex function
mmc_blk_issue_rw_rq() we break out the command abort code.
This code assumes "ret" is != 0 and then repeatedly hammers
blk_end_request() until the request to the block layer to end
the request succeeds.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 4e1f780032c56894e8d7b6685b029b718588f483)

Conflicts:
drivers/mmc/core/block.c

7 years agoblock: add a proper block layer data direction encoding
Christoph Hellwig [Thu, 20 Oct 2016 13:12:15 +0000 (15:12 +0200)]
block: add a proper block layer data direction encoding

Currently the block layer op_is_write, bio_data_dir and rq_data_dir
helper treat every operation that is not a READ as a data out operation.
This worked surprisingly long, but the new REQ_OP_ZONE_REPORT operation
actually adds a second operation that reads data from the device.
Surprisingly nothing critical relied on this direction, but this might
be a good opportunity to properly fix this issue up.

We take a little inspiration and use the least significant bit of the
operation number to encode the data direction, which just requires us
to renumber the operations to fix this scheme.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Shaun Tancheff <shaun.tancheff@seagate.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
(cherry picked from commit 87374179c535a98337569904727aa02f960fe79e)

7 years agoblock: better op and flags encoding
Christoph Hellwig [Fri, 28 Oct 2016 14:48:16 +0000 (08:48 -0600)]
block: better op and flags encoding

Now that we don't need the common flags to overflow outside the range
of a 32-bit type we can encode them the same way for both the bio and
request fields.  This in addition allows us to place the operation
first (and make some room for more ops while we're at it) and to
stop having to shift around the operation values.

In addition this allows passing around only one value in the block layer
instead of two (and eventuall also in the file systems, but we can do
that later) and thus clean up a lot of code.

Last but not least this allows decreasing the size of the cmd_flags
field in struct request to 32-bits.  Various functions passing this
value could also be updated, but I'd like to avoid the churn for now.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
(cherry picked from commit ef295ecf090d3e86e5b742fc6ab34f1122a43773)

Conflicts:
block/blk-mq.c
include/linux/blk_types.h
include/linux/blkdev.h

7 years agoblock: split out request-only flags into a new namespace
Christoph Hellwig [Thu, 20 Oct 2016 13:12:13 +0000 (15:12 +0200)]
block: split out request-only flags into a new namespace

A lot of the REQ_* flags are only used on struct requests, and only of
use to the block layer and a few drivers that dig into struct request
internals.

This patch adds a new req_flags_t rq_flags field to struct request for
them, and thus dramatically shrinks the number of common requests.  It
also removes the unfortunate situation where we have to fit the fields
from the same enum into 32 bits for struct bio and 64 bits for
struct request.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Shaun Tancheff <shaun.tancheff@seagate.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
(cherry picked from commit e806402130c9c494e22c73ae9ead4e79d2a5811c)

Conflicts:
drivers/mmc/core/block.c
drivers/scsi/sd_zbc.c

7 years agoblock: replace REQ_THROTTLED with a bio flag
Christoph Hellwig [Thu, 20 Oct 2016 13:12:12 +0000 (15:12 +0200)]
block: replace REQ_THROTTLED with a bio flag

It's the last bio-only REQ_* flag, and we have space for it in the bio
bi_flags field.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Shaun Tancheff <shaun.tancheff@seagate.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
(cherry picked from commit 8d2bbd4c8236e9e38e6b36ac9e2c54fdcfe5b335)

7 years agoblock: move REQ_RAHEAD to common flags
Christoph Hellwig [Thu, 20 Oct 2016 13:12:11 +0000 (15:12 +0200)]
block: move REQ_RAHEAD to common flags

The information that am I/O is a read-ahead can be useful for drivers.
In fact the NVMe driver already checks it, even if it won't ever be set
at the moment.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Shaun Tancheff <shaun.tancheff@seagate.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
(cherry picked from commit 188bd2b16b3c6ea87a90df20f33db0adcdb75f0c)

7 years agoblock: remove bio_is_rw
Christoph Hellwig [Thu, 20 Oct 2016 13:12:09 +0000 (15:12 +0200)]
block: remove bio_is_rw

With the addition of the zoned operations the tests in this function
became incorrect.  But I think it's much better to just open code the
allow operations in the only caller anyway.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Shaun Tancheff <shaun.tancheff@seagate.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
(cherry picked from commit c4aebd0332da831a3403faf2035af45059ab6b7c)

7 years agoblock: REQ_NOMERGE is common to the bio and request
Christoph Hellwig [Thu, 20 Oct 2016 13:12:10 +0000 (15:12 +0200)]
block: REQ_NOMERGE is common to the bio and request

So move it into the common setion of the request flags.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Shaun Tancheff <shaun.tancheff@seagate.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
(cherry picked from commit bd1c1c21741cbd6e894960bcbc8b36f719590064)

7 years agommc: sdhci: Clear SDHCI_HS400_TUNING flag after platform_execute_tuning
Ritesh Harjani [Tue, 10 Jan 2017 07:00:50 +0000 (12:30 +0530)]
mmc: sdhci: Clear SDHCI_HS400_TUNING flag after platform_execute_tuning

Clear SDHCI_HS400_TUNING flag after platform_execute_tuning
so that platform_execute_tuning may use it if needed.

Signed-off-by: Ritesh Harjani <riteshh@codeaurora.org>
Tested-by: Jeremy McNicoll <jeremymc@redhat.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 8a8fa8797cea4e49119e437d254dd59b9ade16fd)

7 years agommc: core: Don't use extern declarations of public mmc functions
Ulf Hansson [Fri, 13 Jan 2017 13:14:16 +0000 (14:14 +0100)]
mmc: core: Don't use extern declarations of public mmc functions

Using extern when declaring functions in the public header, core.h, is
redundant. Let's just remove the use of it.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
(cherry picked from commit 23888bfe9bd730d42e326cc5f6f1188beb948f97)

7 years agommc: core: Move public functions from host.h to private headers
Ulf Hansson [Fri, 13 Jan 2017 13:14:15 +0000 (14:14 +0100)]
mmc: core: Move public functions from host.h to private headers

A significant amount of functions are available through the public mmc
host.h header file. Let's slim down this public mmc interface, as to
prevent users from abusing it, by moving some of the functions to private
mmc host.h header file.

This change concentrates on moving the functions into private mmc headers,
following changes may continue with additional clean-ups.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
(cherry picked from commit 5857b29b96dcf208e4903ec6f20d132e6a77cac2)

7 years agommc: core: Move public functions from card.h to private headers
Ulf Hansson [Fri, 13 Jan 2017 13:14:14 +0000 (14:14 +0100)]
mmc: core: Move public functions from card.h to private headers

A significant amount of functions and other definitions are available
through the public mmc card.h header file. Let's slim down this public mmc
interface, as to prevent users from abusing it, by moving some of the
functions/definitions to private mmc header files.

This change concentrates on moving the functions into private mmc headers,
following changes may continue with additional clean-ups.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
(cherry picked from commit 4facdde11394d44b3869807841042d059f074a07)

7 years agommc: core: Remove unused struct _mmc_csd from public mmc.h header
Ulf Hansson [Fri, 13 Jan 2017 13:14:11 +0000 (14:14 +0100)]
mmc: core: Remove unused struct _mmc_csd from public mmc.h header

The struct _mmc_csd isn't being used and has been lurking around for a
while. Let's kill it.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
(cherry picked from commit 009b0fcea5dfe77663f7ec3927c7c50a97a7675c)

7 years agommc: core: Move erase/trim/discard defines from public core.h to mmc.h
Ulf Hansson [Fri, 13 Jan 2017 13:14:10 +0000 (14:14 +0100)]
mmc: core: Move erase/trim/discard defines from public core.h to mmc.h

As the public mmc.h header already contains similar defines for other mmc
commands and arguments, let's move those for erase/trim/discard into here
as well.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
(cherry picked from commit c0a3e080f9294117a7d510a4f01a0b7c6dbcadae)

7 years agommc: core: Move some host specific public functions to host.h
Ulf Hansson [Fri, 13 Jan 2017 13:14:09 +0000 (14:14 +0100)]
mmc: core: Move some host specific public functions to host.h

Ideally the public mmc header file, core.h, shouldn't contain interfaces
particularly intended to be used by host drivers. Instead those should
remain in the host.h header file. Therefore, let's move a couple functions
from core.h to host.h.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
(cherry picked from commit 9e1bbc72727506c173cc6ed1d704cb2d7911d9d5)

Conflicts:
include/linux/mmc/core.h

7 years agommc: core: Add helper to see if a host can be retuned
Simon Horman [Thu, 3 Nov 2016 14:15:59 +0000 (15:15 +0100)]
mmc: core: Add helper to see if a host can be retuned

This is in preparation for restoring saved tuning parameters
when resuming the TMIO driver.

Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
Acked-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit c820af5f18ec248b3cb61a9a9ce47ef0f2e9ec63)

7 years agommc: core: Move public functions from core.h to private headers
Ulf Hansson [Fri, 13 Jan 2017 13:14:08 +0000 (14:14 +0100)]
mmc: core: Move public functions from core.h to private headers

A significant amount of functions are available through the public mmc
core.h header file. Let's slim down this public mmc interface, as to
prevent users from abusing it, by moving some of the functions to private
mmc header files.

This change concentrates on moving the functions into private mmc headers,
following changes may continue with additional clean-ups, as an example
some functions can be turned into static.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
(cherry picked from commit 55244c5659b5e73a969b285a2e763223d8aab979)

Conflicts:
include/linux/mmc/core.h

7 years agommc: core: First step in cleaning up private mmc header files
Ulf Hansson [Fri, 13 Jan 2017 13:14:07 +0000 (14:14 +0100)]
mmc: core: First step in cleaning up private mmc header files

This is the first step in cleaning up the private mmc header files. In this
change we makes sure each header file builds standalone, as that helps to
resolve dependencies.

While changing this, it also seems reasonable to stop including other
headers from inside a header itself which it don't depend upon.
Additionally, in some cases such dependencies are better resolved by
forward declaring the needed struct.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
(cherry picked from commit 066185d690631478b16045d152b163a51a5e4847)

7 years agommc: core: First step in cleaning up public mmc header files
Ulf Hansson [Fri, 13 Jan 2017 13:14:06 +0000 (14:14 +0100)]
mmc: core: First step in cleaning up public mmc header files

This is the first step in cleaning up the public mmc header files. In this
change we makes sure each header file builds standalone, as that helps to
resolve dependencies.

While changing this, it also seems reasonable to stop including other
headers from inside a header itself which it don't depend upon.
Additionally, in some cases such dependencies are better resolved by
forward declaring the needed struct.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
(cherry picked from commit 8da007348bf52a91e5137d27d7dcd528edbb80ce)

7 years agommc: mxcmmc: Include interrupt.h in the platform data header
Ulf Hansson [Wed, 11 Jan 2017 11:28:15 +0000 (12:28 +0100)]
mmc: mxcmmc: Include interrupt.h in the platform data header

The mxcmmc platform data header depends on interrupt.h. Don't rely on the
public mmc header host.h to include it, bud instead make that dependency
explicit.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 8336bf68b57e1e736be8d4ef1f46a789fe7b9bde)

7 years agommc: sdio: don't use rocr to check if the card could support UHS mode
Shawn Lin [Mon, 9 Jan 2017 08:56:20 +0000 (16:56 +0800)]
mmc: sdio: don't use rocr to check if the card could support UHS mode

Per SDIO Simplified Specification V3, section 3.1.2, A host that
supports UHS-I sets S18R to 1 in the argument of CMD5 to request a
change of the signal voltage to 1.8V. If the card supports UHS-I and
the current signal voltage is 3.3V, S18A is set to 1 in the R4 response.
If the signal voltage is already 1.8V, the card sets S18A to 0 so that
host maintains the current signal voltage. UHS-I is supported in SD mode
and S18A is always 0 in SPI mode.

For the current code, if the signaling voltage is fixed 1.8v, so
the card will set S18A to 0 for rocr and thus we would clear the
R4_18V_PRESENT from ocr, which make core won't try to use uhs mode.

To fix it, we expect sdio_read_cccr would fail if the uhs mode won't
work at all. Note that it's interesting that some sdio cards still
response S18A even the voltage is fixed to 1.8v and the CMD11 will
also accepted and finish enabling UHS mode successfully. I guess this
is why folks didn't notice this problem. Anyway, fix it.

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 5fc3d80ef496c3bc3e8c09f056e3586fb681de56)

7 years agommc: sdio: Factor out retry init card helper function
Shawn Lin [Mon, 9 Jan 2017 08:56:19 +0000 (16:56 +0800)]
mmc: sdio: Factor out retry init card helper function

Add new helper function, mmc_sdio_resend_if_cond, to be
reused when trying to retry the init sequence.

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 0eb51a58ad823b2081c69ec1cf165833dd11c450)

7 years agommc: core: Use kmalloc_array() in mmc_alloc_sg()
Markus Elfring [Sun, 8 Jan 2017 21:10:40 +0000 (22:10 +0100)]
mmc: core: Use kmalloc_array() in mmc_alloc_sg()

* A multiplication for the size determination of a memory allocation
  indicated that an array data structure should be processed.
  Thus use the corresponding function "kmalloc_array".

  This issue was detected by using the Coccinelle software.

* Replace the specification of a data structure by a pointer dereference
  to make the corresponding size determination a bit safer according to
  the Linux coding style convention.

Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 63928d4789ebb3f7d35d9261089b3bcc98ae0632)

7 years agommc: mmc_test: Use kcalloc() in mmc_test_alloc_mem()
Markus Elfring [Sun, 8 Jan 2017 20:43:12 +0000 (21:43 +0100)]
mmc: mmc_test: Use kcalloc() in mmc_test_alloc_mem()

* The script "checkpatch.pl" pointed information out like the following.

  WARNING: Prefer kcalloc over kzalloc with multiply

  Thus fix the affected source code place.

* Replace the specification of a data structure by a pointer dereference
  to make the corresponding size determination a bit safer according to
  the Linux coding style convention.

Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 3972a20b51c8bb887d13f5656d6fa93bf3d4fc46)

7 years agommc: mmc_test: Improve a size determination in five functions
Markus Elfring [Sun, 8 Jan 2017 20:25:44 +0000 (21:25 +0100)]
mmc: mmc_test: Improve a size determination in five functions

Replace the specification of a data structure by a pointer dereference
as the parameter for the operator "sizeof" to make the corresponding size
determination a bit safer according to the Linux coding style convention.

Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 554d7c540ea0d30e03674a24d139dd8b5c1646c5)

7 years agommc: mmc_test: Combine substrings for 5 messages
Markus Elfring [Sun, 8 Jan 2017 19:56:48 +0000 (20:56 +0100)]
mmc: mmc_test: Combine substrings for 5 messages

The script "checkpatch.pl" pointed information out like the following.

WARNING: quoted string split across lines

Thus fix affected source code places.

Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 7200449dc6a1f4556ad5da20df031bfbaf42fff5)

7 years agommc: mmc_test: Add some spaces for better code readability
Markus Elfring [Sun, 8 Jan 2017 19:25:39 +0000 (20:25 +0100)]
mmc: mmc_test: Add some spaces for better code readability

Use space characters at some source code places according to
the Linux coding style convention.

Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit fda02ea814f92d11a2400ec583b4d83cbb633ad0)

7 years agommc: mmc_test: Use seq_puts() in mtf_testlist_show()
Markus Elfring [Sun, 8 Jan 2017 18:48:28 +0000 (19:48 +0100)]
mmc: mmc_test: Use seq_puts() in mtf_testlist_show()

The script "checkpatch.pl" pointed information out like the following.

WARNING: Prefer seq_puts to seq_printf

Thus fix the affected source code place.

Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit dc3a5fe6ec115ee1d9d1c2ee8004c9a5193b2435)

7 years agommc: mmc_test: Fix a typo in a comment line
Markus Elfring [Sun, 8 Jan 2017 18:05:37 +0000 (19:05 +0100)]
mmc: mmc_test: Fix a typo in a comment line

Add a missing character in the function description.

Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 74536bc0834fbfd5ead74beef20f9ba387df6a5a)

7 years agommc: mmc_test: Use kmalloc_array() in mmc_test_area_init()
Markus Elfring [Sun, 8 Jan 2017 17:44:26 +0000 (18:44 +0100)]
mmc: mmc_test: Use kmalloc_array() in mmc_test_area_init()

* A multiplication for the size determination of a memory allocation
  indicated that an array data structure should be processed.
  Thus use the corresponding function "kmalloc_array".

  This issue was detected by using the Coccinelle software.

* Replace the specification of a data structure by a pointer dereference
  to make the corresponding size determination a bit safer according to
  the Linux coding style convention.

Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 457e4f7f668d69bc105b3619c5ff2769506adb89)

7 years agommc: sdhci-esdhc: clean up register definitions
yangbo lu [Mon, 26 Dec 2016 09:46:29 +0000 (17:46 +0800)]
mmc: sdhci-esdhc: clean up register definitions

The eSDHC register definitions in header file were messy and confusing.
This patch is to clean up these definitions.

Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit a6b448884a5f8eed5fec888f918aef26be338912)

7 years agommc: host: Include interrupt.h in mmc host drivers that depends on it
Ulf Hansson [Fri, 30 Dec 2016 12:47:23 +0000 (13:47 +0100)]
mmc: host: Include interrupt.h in mmc host drivers that depends on it

An mmc host driver shouldn't rely on interrupt.h being included by another
public mmc header. Instead make that dependency explicit by including
interrupt.h in those host drivers that depends on it.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
(cherry picked from commit b8789ec482bbbf52f62631e25b6c8648fa834efc)

Conflicts:
drivers/mmc/host/davinci_mmc.c
drivers/mmc/host/dw_mmc.h
drivers/mmc/host/meson-gx-mmc.c

7 years agommc: sdhci: Include leds.h
Ulf Hansson [Fri, 30 Dec 2016 12:47:22 +0000 (13:47 +0100)]
mmc: sdhci: Include leds.h

Don't rely on host.h to include the leds.h header, but instead include it
explicitly because the driver depends on it.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
(cherry picked from commit 210583f47293c3a4a96a7e0d3e10b3210d542656)

7 years agommc: use empty initializer list to zero-clear structures
Masahiro Yamada [Mon, 19 Dec 2016 11:51:18 +0000 (20:51 +0900)]
mmc: use empty initializer list to zero-clear structures

In the MMC subsystem, we see such initializers that only clears the
first member explicitly.

For example,

  struct mmc_request mrq = {NULL};

sets the first member (.sbc) to NULL explicitly.  However, this is
an unstable form because we may insert a non-pointer member at the
top of the struct mmc_request in the future. (if we do so, the
compiler will spit warnings.)

So, using a designated initializer is preferred coding style.  The
expression above is equivalent to:

  struct mmc_request mrq = { .sbc = NULL };

Of course, this does not express our intention.  We want to fill
all struct members with zeros.  Please note struct members are
implicitly zero-cleared unless otherwise specified in the initializer.

After all, the most reasonable (and stable) form is:

  struct mmc_request mrq = {};

Do likewise for mmc_command, mmc_data as well.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit c7836d1593b87cb813c58cf64e08b052ebbe2a78)

7 years agommc: block: Replace "goto retry" by a proper do / while loop
Geert Uytterhoeven [Mon, 19 Dec 2016 14:03:45 +0000 (15:03 +0100)]
mmc: block: Replace "goto retry" by a proper do / while loop

Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 164b50b353908c79b551b3658e37f29182e2c0b3)

7 years agommc: block: Avoid uninitialized warning in mmc_blk_issue_discard_rq()
Geert Uytterhoeven [Mon, 19 Dec 2016 14:03:44 +0000 (15:03 +0100)]
mmc: block: Avoid uninitialized warning in mmc_blk_issue_discard_rq()

With gcc-4.1.2:

    mmc/core/block.c: In function ‘mmc_blk_issue_discard_rq’:
    mmc/core/block.c:1150: warning: ‘arg’ may be used uninitialized in this function
    mmc/core/block.c:1150: warning: ‘nr’ may be used uninitialized in this function
    mmc/core/block.c:1150: warning: ‘from’ may be used uninitialized in this function

While this is a false positive, it can be avoided easily by jumping over
the checks for "err" that are always false.

Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 8cb6ed17eb30f190f215031844433981644b064d)

7 years agommc: core: Export device lifetime information through sysfs
Jungseung Lee [Thu, 22 Dec 2016 03:37:34 +0000 (12:37 +0900)]
mmc: core: Export device lifetime information through sysfs

In the eMMC 5.0 version of the spec, several EXT_CSD fields about
device lifetime are added.

 - Two types of estimated indications reflected by averaged wear out of memory
 - An indication reflected by average reserved blocks

Export the information through sysfs.

Signed-off-by: Jungseung Lee <js07.lee@samsung.com>
Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 46bc5c408e4e325efbfff26609c76099979180a7)

7 years agommc: remove pointless request type check in mmc_prep_request
Christoph Hellwig [Tue, 31 Jan 2017 15:57:24 +0000 (16:57 +0100)]
mmc: remove pointless request type check in mmc_prep_request

The block layer won't send requests the driver isn't asking for,
so remove this check.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
(cherry picked from commit 261c83c1a9e5b74e41037cc804e8b9ae21623ddd)

7 years agommc: core: Restore parts of the polling policy when switch to HS/HS DDR
Ulf Hansson [Fri, 13 Jan 2017 11:05:03 +0000 (12:05 +0100)]
mmc: core: Restore parts of the polling policy when switch to HS/HS DDR

Regressions for not being able to detect an eMMC HS DDR mode card has been
reported for the sdhci-esdhc-imx driver, but potentially other sdhci
variants may suffer from the similar problem.

The commit e173f8911f09 ("mmc: core: Update CMD13 polling policy when
switch to HS DDR mode"), is causing the problem. It seems that change moved
one step to far, regarding changing the host's timing before polling for a
busy card.

To fix this, let's move back to the behaviour when the host's timing is
updated after the polling, but before the switch status is fetched and
validated.

In cases when polling with CMD13, we keep validating the switch status at
each attempt. However, to align with the other card busy detections
mechanism, let's fetch and validate the switch status also after the host's
timing is updated.

Reported-by: Clemens Gruber <clemens.gruber@pqgruber.com>
Reported-by: Gary Bisson <gary.bisson@boundarydevices.com>
Fixes: e173f8911f09 ("mmc: core: Update CMD13 polling policy when switch..")
Cc: Shawn Lin <shawn.lin@rock-chips.com>
Cc: Dong Aisheng <aisheng.dong@nxp.com>
Cc: Haibo Chen <haibo.chen@nxp.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Clemens Gruber <clemens.gruber@pqgruber.com>
Tested-by: Jagan Teki <jagan@amarulasolutions.com>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Tested-by: Haibo Chen <haibo.chen@nxp.com>
Reviewed-by: Dong Aisheng <aisheng.dong@nxp.com>
(cherry picked from commit ee6ff743e3a4b697e8286054667d7e4e1b56510d)

Conflicts:
drivers/mmc/core/mmc_ops.c

7 years agommc: core: Further fix thread wake-up
Adrian Hunter [Mon, 19 Dec 2016 13:57:34 +0000 (15:57 +0200)]
mmc: core: Further fix thread wake-up

Commit e0097cf5f2f1 ("mmc: queue: Fix queue thread wake-up") did not go far
enough. mmc_wait_for_data_req_done() still contains some problems and can
be further simplified.  First it should not touch
context_info->is_waiting_last_req because that is a wake-up control used by
the owner of the context. Secondly, it should always return when one of its
wake-up conditions is met because, again, that is contolled by the owner of
the context.

While the current block driver does not have an issue, these problems were
exposed during testing of the Software Command Queue patches.

Fixes: e0097cf5f2f1 ("mmc: queue: Fix queue thread wake-up")
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Tested-by: Harjani Ritesh <riteshh@codeaurora.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 15520111500c33a012aeec28ece8c5f2dcbf6b5e)

7 years agommc: sdhci: Fix to handle MMC_POWER_UNDEFINED
Adrian Hunter [Mon, 19 Dec 2016 13:33:11 +0000 (15:33 +0200)]
mmc: sdhci: Fix to handle MMC_POWER_UNDEFINED

Since commit c2c24819b280 ("mmc: core: Don't power off the card when
starting the host"), the power state can still be MMC_POWER_UNDEFINED after
mmc_start_host() is called. That can trigger a warning in SDHCI during
runtime resume as it tries to restore the I/O state. Handle
MMC_POWER_UNDEFINED simply by not updating the I/O state in that case.

Fixes: c2c24819b280 ("mmc: core: Don't power off the card when starting the host")
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 84ec048ba133c2a570273e90622d8fac4930553e)

Conflicts:
drivers/mmc/host/sdhci.c

7 years agommc: block: Move files to core
Ulf Hansson [Thu, 8 Dec 2016 10:23:49 +0000 (11:23 +0100)]
mmc: block: Move files to core

Once upon a time it made sense to keep the mmc block device driver and its
related code, in its own directory called card. Over time, more an more
functions/structures have become shared through generic mmc header files,
between the core and the card directory. In other words, the relationship
between them has become closer.

By sharing functions/structures via generic header files, it becomes easy
for outside users to abuse them. In a way to avoid that from happen, let's
move the files from card directory into the core directory, as it enables
us to move definitions of functions/structures into mmc core specific
header files.

Note, this is only the first step in providing a cleaner mmc interface for
outside users. Following changes will do the actual cleanup, as that is not
part of this change.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
(cherry picked from commit f397c8d80a5e413984bd9ccdf4161c7156b365ce)

7 years agommc: sdhci: export sdhci_execute_tuning()
Masahiro Yamada [Thu, 8 Dec 2016 12:50:54 +0000 (21:50 +0900)]
mmc: sdhci: export sdhci_execute_tuning()

Some SDHCI-compat controllers support not only SD, but also eMMC,
but they use different commands for tuning: CMD19 for SD, CMD21 for
eMMC.

Due to the difference of the underlying mechanism, some controllers
(at least, the Cadence IP is the case) provide their own registers
for the eMMC tuning.

This commit will be useful when we want to override .execute_tuning
callback (for eMMC HS200 tuning), but still let it fall back to
sdhci_execute_tuning() for SD timing.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 85a882c2e91d3655927ecdc1db823d1420a65b8f)

7 years agommc: sdhci: Tidy tuning loop
Adrian Hunter [Fri, 2 Dec 2016 13:14:27 +0000 (15:14 +0200)]
mmc: sdhci: Tidy tuning loop

Tidy the tuning loop by moving it to a separate function and making it a
for-loop.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 6b11e70bb72c5bfbd7d1544518d26d4b1100aae1)

Conflicts:
drivers/mmc/host/sdhci.c

7 years agommc: sdhci: Simplify tuning block size logic
Adrian Hunter [Fri, 2 Dec 2016 13:14:26 +0000 (15:14 +0200)]
mmc: sdhci: Simplify tuning block size logic

There are only 2 possible block sizes, so simplify 2 if-statements into 1.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 85336109c0b272d8d0b4509872e1247d948ddfa9)

7 years agommc: sdhci: Factor out tuning helper functions
Adrian Hunter [Fri, 2 Dec 2016 13:59:23 +0000 (15:59 +0200)]
mmc: sdhci: Factor out tuning helper functions

Factor out some functions to tidy up the code in sdhci_execute_tuning.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit da4bc4f2851e3c46076929a8c9a99ee3e076cf1f)