2019-06-04 16:11:33 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
* linux/include/linux/mmc/host.h
|
|
|
|
*
|
|
|
|
* Host driver specific definitions.
|
|
|
|
*/
|
|
|
|
#ifndef LINUX_MMC_HOST_H
|
|
|
|
#define LINUX_MMC_HOST_H
|
|
|
|
|
2009-10-07 21:09:06 +08:00
|
|
|
#include <linux/sched.h>
|
2012-01-31 00:46:54 +08:00
|
|
|
#include <linux/device.h>
|
2011-08-19 20:52:37 +08:00
|
|
|
#include <linux/fault-inject.h>
|
2007-09-24 13:15:48 +08:00
|
|
|
|
2007-02-28 22:33:10 +08:00
|
|
|
#include <linux/mmc/core.h>
|
2014-04-23 16:07:35 +08:00
|
|
|
#include <linux/mmc/card.h>
|
2010-03-06 05:43:31 +08:00
|
|
|
#include <linux/mmc/pm.h>
|
2017-03-27 02:41:32 +08:00
|
|
|
#include <linux/dma-direction.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
struct mmc_ios {
|
|
|
|
unsigned int clock; /* clock rate */
|
|
|
|
unsigned short vdd;
|
mmc: core: add tunable delay waiting for power to be stable
The hard-coded 10ms delay in mmc_power_up came from
commit 79bccc5aefb4 ("mmc: increase power up delay"), which said "The TI
controller on Toshiba Tecra M5 needs more time to power up or the cards
will init incorrectly or not at all." But it's too engineering solution
for a special board but force all platforms to wait for that long time,
especially painful for mmc_power_up for eMMC when booting.
However, it's added since 2009, and we can't tell if other platforms
benefit from it. But in practise, the modern hardware are most likely to
have a stable power supply with 1ms after setting it for no matter PMIC
or discrete power. And more importnatly, most regulators implement the
callback of ->set_voltage_time_sel() for regulator core to wait for
specific period of time for the power supply to be stable, which means
once regulator_set_voltage_* return, the power should reach the the
minimum voltage that works for initialization. Of course, if there
are some other ways for host to power the card, we should allow them
to argue a suitable delay as well.
With this patch, we could assign the delay from firmware, or we could
assigne it via ->set_ios() callback from host drivers.
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
2018-05-08 09:04:20 +08:00
|
|
|
unsigned int power_delay_ms; /* waiting for stable power */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-03-12 08:15:15 +08:00
|
|
|
/* vdd stores the bit number of the selected voltage range from below. */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
unsigned char bus_mode; /* command output mode */
|
|
|
|
|
|
|
|
#define MMC_BUSMODE_OPENDRAIN 1
|
|
|
|
#define MMC_BUSMODE_PUSHPULL 2
|
|
|
|
|
2005-09-03 23:45:02 +08:00
|
|
|
unsigned char chip_select; /* SPI chip select */
|
|
|
|
|
|
|
|
#define MMC_CS_DONTCARE 0
|
|
|
|
#define MMC_CS_HIGH 1
|
|
|
|
#define MMC_CS_LOW 2
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
unsigned char power_mode; /* power supply mode */
|
|
|
|
|
|
|
|
#define MMC_POWER_OFF 0
|
|
|
|
#define MMC_POWER_UP 1
|
|
|
|
#define MMC_POWER_ON 2
|
2014-09-24 17:07:13 +08:00
|
|
|
#define MMC_POWER_UNDEFINED 3
|
2005-09-07 06:18:55 +08:00
|
|
|
|
|
|
|
unsigned char bus_width; /* data bus width */
|
|
|
|
|
|
|
|
#define MMC_BUS_WIDTH_1 0
|
|
|
|
#define MMC_BUS_WIDTH_4 2
|
2008-11-17 20:35:21 +08:00
|
|
|
#define MMC_BUS_WIDTH_8 3
|
2007-02-18 19:07:47 +08:00
|
|
|
|
|
|
|
unsigned char timing; /* timing specification used */
|
|
|
|
|
|
|
|
#define MMC_TIMING_LEGACY 0
|
|
|
|
#define MMC_TIMING_MMC_HS 1
|
|
|
|
#define MMC_TIMING_SD_HS 2
|
2012-10-17 19:04:46 +08:00
|
|
|
#define MMC_TIMING_UHS_SDR12 3
|
|
|
|
#define MMC_TIMING_UHS_SDR25 4
|
|
|
|
#define MMC_TIMING_UHS_SDR50 5
|
|
|
|
#define MMC_TIMING_UHS_SDR104 6
|
|
|
|
#define MMC_TIMING_UHS_DDR50 7
|
2014-03-14 20:11:56 +08:00
|
|
|
#define MMC_TIMING_MMC_DDR52 8
|
|
|
|
#define MMC_TIMING_MMC_HS200 9
|
2014-04-23 16:14:58 +08:00
|
|
|
#define MMC_TIMING_MMC_HS400 10
|
2010-08-24 18:20:26 +08:00
|
|
|
|
mmc: sd: add support for signal voltage switch procedure
Host Controller v3.00 adds another Capabilities register. Apart
from other things, this new register indicates whether the Host
Controller supports SDR50, SDR104, and DDR50 UHS-I modes. The spec
doesn't mention about explicit support for SDR12 and SDR25 UHS-I
modes, so the Host Controller v3.00 should support them by default.
Also if the controller supports SDR104 mode, it will also support
SDR50 mode as well. So depending on the host support, we set the
corresponding MMC_CAP_* flags. One more new register. Host Control2
is added in v3.00, which is used during Signal Voltage Switch
procedure described below.
Since as per v3.00 spec, UHS-I supported hosts should set S18R
to 1, we set S18R (bit 24) of OCR before sending ACMD41. We also
need to set XPC (bit 28) of OCR in case the host can supply >150mA.
This support is indicated by the Maximum Current Capabilities
register of the Host Controller.
If the response of ACMD41 has both CCS and S18A set, we start the
signal voltage switch procedure, which if successfull, will switch
the card from 3.3V signalling to 1.8V signalling. Signal voltage
switch procedure adds support for a new command CMD11 in the
Physical Layer Spec v3.01. As part of this procedure, we need to
set 1.8V Signalling Enable (bit 3) of Host Control2 register, which
if remains set after 5ms, means the switch to 1.8V signalling is
successfull. Otherwise, we clear bit 24 of OCR and retry the
initialization sequence. When we remove the card, and insert the
same or another card, we need to make sure that we start with 3.3V
signalling voltage. So we call mmc_set_signal_voltage() with
MMC_SIGNAL_VOLTAGE_330 set so that we are back to 3.3V signalling
voltage before we actually start initializing the card.
Tested by Zhangfei Gao with a Toshiba uhs card and general hs card,
on mmp2 in SDMA mode.
Signed-off-by: Arindam Nath <arindam.nath@amd.com>
Reviewed-by: Philip Rakity <prakity@marvell.com>
Tested-by: Philip Rakity <prakity@marvell.com>
Acked-by: Zhangfei Gao <zhangfei.gao@marvell.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
2011-05-05 14:48:57 +08:00
|
|
|
unsigned char signal_voltage; /* signalling voltage (1.8V or 3.3V) */
|
|
|
|
|
|
|
|
#define MMC_SIGNAL_VOLTAGE_330 0
|
|
|
|
#define MMC_SIGNAL_VOLTAGE_180 1
|
2011-05-13 13:47:18 +08:00
|
|
|
#define MMC_SIGNAL_VOLTAGE_120 2
|
2011-05-05 14:48:59 +08:00
|
|
|
|
|
|
|
unsigned char drv_type; /* driver type (A, B, C, D) */
|
|
|
|
|
|
|
|
#define MMC_SET_DRIVER_TYPE_B 0
|
|
|
|
#define MMC_SET_DRIVER_TYPE_A 1
|
|
|
|
#define MMC_SET_DRIVER_TYPE_C 2
|
|
|
|
#define MMC_SET_DRIVER_TYPE_D 3
|
2016-05-26 09:56:22 +08:00
|
|
|
|
|
|
|
bool enhanced_strobe; /* hs400es selection */
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2017-01-13 21:14:06 +08:00
|
|
|
struct mmc_host;
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
struct mmc_host_ops {
|
2011-07-02 00:55:22 +08:00
|
|
|
/*
|
|
|
|
* It is optional for the host to implement pre_req and post_req in
|
|
|
|
* order to support double buffering of requests (prepare one
|
|
|
|
* request while another request is active).
|
2011-08-29 21:35:58 +08:00
|
|
|
* pre_req() must always be followed by a post_req().
|
|
|
|
* To undo a call made to pre_req(), call post_req() with
|
|
|
|
* a nonzero err condition.
|
2011-07-02 00:55:22 +08:00
|
|
|
*/
|
|
|
|
void (*post_req)(struct mmc_host *host, struct mmc_request *req,
|
|
|
|
int err);
|
2016-11-23 18:02:24 +08:00
|
|
|
void (*pre_req)(struct mmc_host *host, struct mmc_request *req);
|
2005-04-17 06:20:36 +08:00
|
|
|
void (*request)(struct mmc_host *host, struct mmc_request *req);
|
2020-04-13 10:46:03 +08:00
|
|
|
/* Submit one request to host in atomic context. */
|
|
|
|
int (*request_atomic)(struct mmc_host *host,
|
|
|
|
struct mmc_request *req);
|
2016-04-01 23:44:36 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Avoid calling the next three functions too often or in a "fast
|
|
|
|
* path", since underlaying controller might implement them in an
|
|
|
|
* expensive and/or slow way. Also note that these functions might
|
|
|
|
* sleep, so don't call them in the atomic contexts!
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Notes to the set_ios callback:
|
|
|
|
* ios->clock might be 0. For some controllers, setting 0Hz
|
|
|
|
* as any other frequency works. However, some controllers
|
|
|
|
* explicitly need to disable the clock. Otherwise e.g. voltage
|
|
|
|
* switching might fail because the SDCLK is not really quiet.
|
|
|
|
*/
|
|
|
|
void (*set_ios)(struct mmc_host *host, struct mmc_ios *ios);
|
|
|
|
|
2008-06-17 22:17:15 +08:00
|
|
|
/*
|
2008-06-17 22:17:39 +08:00
|
|
|
* Return values for the get_ro callback should be:
|
|
|
|
* 0 for a read/write card
|
|
|
|
* 1 for a read-only card
|
|
|
|
* -ENOSYS when not supported (equal to NULL callback)
|
|
|
|
* or a negative errno value when something bad happened
|
2016-04-01 23:44:36 +08:00
|
|
|
*/
|
|
|
|
int (*get_ro)(struct mmc_host *host);
|
|
|
|
|
|
|
|
/*
|
2008-09-02 16:14:13 +08:00
|
|
|
* Return values for the get_cd callback should be:
|
2008-06-17 22:17:39 +08:00
|
|
|
* 0 for a absent card
|
|
|
|
* 1 for a present card
|
|
|
|
* -ENOSYS when not supported (equal to NULL callback)
|
|
|
|
* or a negative errno value when something bad happened
|
2008-06-17 22:17:15 +08:00
|
|
|
*/
|
|
|
|
int (*get_cd)(struct mmc_host *host);
|
|
|
|
|
2007-07-24 14:09:39 +08:00
|
|
|
void (*enable_sdio_irq)(struct mmc_host *host, int enable);
|
2019-09-08 18:12:31 +08:00
|
|
|
/* Mandatory callback when using MMC_CAP2_SDIO_IRQ_NOTHREAD. */
|
mmc: sdio: Add API to manage SDIO IRQs from a workqueue
For hosts not supporting MMC_CAP2_SDIO_IRQ_NOTHREAD but MMC_CAP_SDIO_IRQ,
the SDIO IRQs are processed from a dedicated kernel thread. For these
cases, the host calls mmc_signal_sdio_irq() from its ISR to signal a new
SDIO IRQ.
Signaling an SDIO IRQ makes the host's ->enable_sdio_irq() callback to be
invoked to temporary disable the IRQs, before the kernel thread is woken up
to process it. When processing of the IRQs are completed, they are
re-enabled by the kernel thread, again via invoking the host's
->enable_sdio_irq().
The observation from this, is that the execution path is being unnecessary
complex, as the host driver already knows that it needs to temporary
disable the IRQs before signaling a new one. Moreover, replacing the kernel
thread with a work/workqueue would not only greatly simplify the code, but
also make it more robust.
To address the above problems, let's continue to build upon the support for
MMC_CAP2_SDIO_IRQ_NOTHREAD, as it already implements SDIO IRQs to be
processed without using the clumsy kernel thread and without the ping-pong
calls of the host's ->enable_sdio_irq() callback for each processed IRQ.
Therefore, let's add new API sdio_signal_irq(), which enables hosts to
signal/process SDIO IRQs by using a work/workqueue, rather than using the
kernel thread.
Add also a new host callback ->ack_sdio_irq(), which the work invokes when
the SDIO IRQs have been processed. This informs the host about when it
shall re-enable the SDIO IRQs. Potentially, we could re-use the existing
->enable_sdio_irq() callback instead of adding a new one, however it has
turned out that it's more convenient for hosts to get this information via
a separate callback.
Hosts that wants to use this new method to signal/process SDIO IRQs, must
enable MMC_CAP2_SDIO_IRQ_NOTHREAD and implement the ->ack_sdio_irq()
callback.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
2017-04-13 22:48:11 +08:00
|
|
|
void (*ack_sdio_irq)(struct mmc_host *host);
|
2010-04-01 16:03:25 +08:00
|
|
|
|
|
|
|
/* optional callback for HC quirks */
|
|
|
|
void (*init_card)(struct mmc_host *host, struct mmc_card *card);
|
mmc: sd: add support for signal voltage switch procedure
Host Controller v3.00 adds another Capabilities register. Apart
from other things, this new register indicates whether the Host
Controller supports SDR50, SDR104, and DDR50 UHS-I modes. The spec
doesn't mention about explicit support for SDR12 and SDR25 UHS-I
modes, so the Host Controller v3.00 should support them by default.
Also if the controller supports SDR104 mode, it will also support
SDR50 mode as well. So depending on the host support, we set the
corresponding MMC_CAP_* flags. One more new register. Host Control2
is added in v3.00, which is used during Signal Voltage Switch
procedure described below.
Since as per v3.00 spec, UHS-I supported hosts should set S18R
to 1, we set S18R (bit 24) of OCR before sending ACMD41. We also
need to set XPC (bit 28) of OCR in case the host can supply >150mA.
This support is indicated by the Maximum Current Capabilities
register of the Host Controller.
If the response of ACMD41 has both CCS and S18A set, we start the
signal voltage switch procedure, which if successfull, will switch
the card from 3.3V signalling to 1.8V signalling. Signal voltage
switch procedure adds support for a new command CMD11 in the
Physical Layer Spec v3.01. As part of this procedure, we need to
set 1.8V Signalling Enable (bit 3) of Host Control2 register, which
if remains set after 5ms, means the switch to 1.8V signalling is
successfull. Otherwise, we clear bit 24 of OCR and retry the
initialization sequence. When we remove the card, and insert the
same or another card, we need to make sure that we start with 3.3V
signalling voltage. So we call mmc_set_signal_voltage() with
MMC_SIGNAL_VOLTAGE_330 set so that we are back to 3.3V signalling
voltage before we actually start initializing the card.
Tested by Zhangfei Gao with a Toshiba uhs card and general hs card,
on mmp2 in SDMA mode.
Signed-off-by: Arindam Nath <arindam.nath@amd.com>
Reviewed-by: Philip Rakity <prakity@marvell.com>
Tested-by: Philip Rakity <prakity@marvell.com>
Acked-by: Zhangfei Gao <zhangfei.gao@marvell.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
2011-05-05 14:48:57 +08:00
|
|
|
|
|
|
|
int (*start_signal_voltage_switch)(struct mmc_host *host, struct mmc_ios *ios);
|
2012-01-12 03:04:52 +08:00
|
|
|
|
2013-01-28 22:08:26 +08:00
|
|
|
/* Check if the card is pulling dat[0:3] low */
|
|
|
|
int (*card_busy)(struct mmc_host *host);
|
|
|
|
|
2012-01-12 03:04:52 +08:00
|
|
|
/* The tuning command opcode value is different for SD and eMMC cards */
|
|
|
|
int (*execute_tuning)(struct mmc_host *host, u32 opcode);
|
2014-04-23 16:14:58 +08:00
|
|
|
|
|
|
|
/* Prepare HS400 target operating frequency depending host driver */
|
|
|
|
int (*prepare_hs400_tuning)(struct mmc_host *host, struct mmc_ios *ios);
|
2018-06-18 20:57:49 +08:00
|
|
|
|
2018-11-23 11:15:33 +08:00
|
|
|
/* Prepare switch to DDR during the HS400 init sequence */
|
|
|
|
int (*hs400_prepare_ddr)(struct mmc_host *host);
|
|
|
|
|
2018-06-18 20:57:49 +08:00
|
|
|
/* Prepare for switching from HS400 to HS200 */
|
|
|
|
void (*hs400_downgrade)(struct mmc_host *host);
|
|
|
|
|
|
|
|
/* Complete selection of HS400 */
|
|
|
|
void (*hs400_complete)(struct mmc_host *host);
|
|
|
|
|
2016-05-26 09:56:22 +08:00
|
|
|
/* Prepare enhanced strobe depending host driver */
|
|
|
|
void (*hs400_enhanced_strobe)(struct mmc_host *host,
|
|
|
|
struct mmc_ios *ios);
|
2015-02-06 20:12:54 +08:00
|
|
|
int (*select_drive_strength)(struct mmc_card *card,
|
|
|
|
unsigned int max_dtr, int host_drv,
|
2015-02-06 20:12:52 +08:00
|
|
|
int card_drv, int *drv_type);
|
2011-08-29 21:42:11 +08:00
|
|
|
void (*hw_reset)(struct mmc_host *host);
|
2012-12-04 23:51:32 +08:00
|
|
|
void (*card_event)(struct mmc_host *host);
|
2014-09-03 10:08:53 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Optional callback to support controllers with HW issues for multiple
|
|
|
|
* I/O. Returns the number of supported blocks for the request.
|
|
|
|
*/
|
|
|
|
int (*multi_io_quirk)(struct mmc_card *card,
|
|
|
|
unsigned int direction, int blk_size);
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2017-08-25 20:43:46 +08:00
|
|
|
struct mmc_cqe_ops {
|
|
|
|
/* Allocate resources, and make the CQE operational */
|
|
|
|
int (*cqe_enable)(struct mmc_host *host, struct mmc_card *card);
|
|
|
|
/* Free resources, and make the CQE non-operational */
|
|
|
|
void (*cqe_disable)(struct mmc_host *host);
|
|
|
|
/*
|
|
|
|
* Issue a read, write or DCMD request to the CQE. Also deal with the
|
|
|
|
* effect of ->cqe_off().
|
|
|
|
*/
|
|
|
|
int (*cqe_request)(struct mmc_host *host, struct mmc_request *mrq);
|
|
|
|
/* Free resources (e.g. DMA mapping) associated with the request */
|
|
|
|
void (*cqe_post_req)(struct mmc_host *host, struct mmc_request *mrq);
|
|
|
|
/*
|
|
|
|
* Prepare the CQE and host controller to accept non-CQ commands. There
|
|
|
|
* is no corresponding ->cqe_on(), instead ->cqe_request() is required
|
|
|
|
* to deal with that.
|
|
|
|
*/
|
|
|
|
void (*cqe_off)(struct mmc_host *host);
|
|
|
|
/*
|
|
|
|
* Wait for all CQE tasks to complete. Return an error if recovery
|
|
|
|
* becomes necessary.
|
|
|
|
*/
|
|
|
|
int (*cqe_wait_for_idle)(struct mmc_host *host);
|
|
|
|
/*
|
|
|
|
* Notify CQE that a request has timed out. Return false if the request
|
|
|
|
* completed or true if a timeout happened in which case indicate if
|
|
|
|
* recovery is needed.
|
|
|
|
*/
|
|
|
|
bool (*cqe_timeout)(struct mmc_host *host, struct mmc_request *mrq,
|
|
|
|
bool *recovery_needed);
|
|
|
|
/*
|
|
|
|
* Stop all CQE activity and prepare the CQE and host controller to
|
|
|
|
* accept recovery commands.
|
|
|
|
*/
|
|
|
|
void (*cqe_recovery_start)(struct mmc_host *host);
|
|
|
|
/*
|
|
|
|
* Clear the queue and call mmc_cqe_request_done() on all requests.
|
|
|
|
* Requests that errored will have the error set on the mmc_request
|
|
|
|
* (data->error or cmd->error for DCMD). Requests that did not error
|
|
|
|
* will have zero data bytes transferred.
|
|
|
|
*/
|
|
|
|
void (*cqe_recovery_finish)(struct mmc_host *host);
|
|
|
|
};
|
|
|
|
|
2011-07-02 00:55:22 +08:00
|
|
|
struct mmc_async_req {
|
|
|
|
/* active mmc request */
|
|
|
|
struct mmc_request *mrq;
|
|
|
|
/*
|
|
|
|
* Check error status of completed mmc request.
|
|
|
|
* Returns 0 if success otherwise non zero.
|
|
|
|
*/
|
2016-11-04 18:05:19 +08:00
|
|
|
enum mmc_blk_status (*err_check)(struct mmc_card *, struct mmc_async_req *);
|
2011-07-02 00:55:22 +08:00
|
|
|
};
|
|
|
|
|
2012-05-01 21:40:15 +08:00
|
|
|
/**
|
|
|
|
* struct mmc_slot - MMC slot functions
|
|
|
|
*
|
|
|
|
* @cd_irq: MMC/SD-card slot hotplug detection IRQ or -EINVAL
|
|
|
|
* @handler_priv: MMC/SD-card slot context
|
|
|
|
*
|
|
|
|
* Some MMC/SD host controllers implement slot-functions like card and
|
|
|
|
* write-protect detection natively. However, a large number of controllers
|
|
|
|
* leave these functions to the CPU. This struct provides a hook to attach
|
|
|
|
* such slot-function drivers.
|
|
|
|
*/
|
|
|
|
struct mmc_slot {
|
|
|
|
int cd_irq;
|
2017-06-13 20:07:51 +08:00
|
|
|
bool cd_wake_enabled;
|
2011-12-26 09:40:03 +08:00
|
|
|
void *handler_priv;
|
|
|
|
};
|
|
|
|
|
2013-01-15 03:28:17 +08:00
|
|
|
/**
|
|
|
|
* mmc_context_info - synchronization details for mmc context
|
|
|
|
* @is_done_rcv wake up reason was done request
|
|
|
|
* @is_new_req wake up reason was new request
|
|
|
|
* @is_waiting_last_req mmc context waiting for single running request
|
|
|
|
* @wait wait queue
|
|
|
|
*/
|
|
|
|
struct mmc_context_info {
|
|
|
|
bool is_done_rcv;
|
|
|
|
bool is_new_req;
|
|
|
|
bool is_waiting_last_req;
|
|
|
|
wait_queue_head_t wait;
|
|
|
|
};
|
|
|
|
|
2012-06-20 14:28:43 +08:00
|
|
|
struct regulator;
|
2014-11-28 21:38:36 +08:00
|
|
|
struct mmc_pwrseq;
|
2012-06-20 14:28:43 +08:00
|
|
|
|
|
|
|
struct mmc_supply {
|
|
|
|
struct regulator *vmmc; /* Card power supply */
|
|
|
|
struct regulator *vqmmc; /* Optional Vccq supply */
|
|
|
|
};
|
|
|
|
|
2017-09-22 20:36:51 +08:00
|
|
|
struct mmc_ctx {
|
|
|
|
struct task_struct *task;
|
|
|
|
};
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
struct mmc_host {
|
2006-09-12 23:00:10 +08:00
|
|
|
struct device *parent;
|
|
|
|
struct device class_dev;
|
2005-08-19 16:42:52 +08:00
|
|
|
int index;
|
2006-09-03 21:43:33 +08:00
|
|
|
const struct mmc_host_ops *ops;
|
2014-11-28 21:38:36 +08:00
|
|
|
struct mmc_pwrseq *pwrseq;
|
2005-04-17 06:20:36 +08:00
|
|
|
unsigned int f_min;
|
|
|
|
unsigned int f_max;
|
2010-09-06 09:37:19 +08:00
|
|
|
unsigned int f_init;
|
2005-04-17 06:20:36 +08:00
|
|
|
u32 ocr_avail;
|
2010-12-08 17:04:30 +08:00
|
|
|
u32 ocr_avail_sdio; /* SDIO-specific OCR */
|
|
|
|
u32 ocr_avail_sd; /* SD-specific OCR */
|
|
|
|
u32 ocr_avail_mmc; /* MMC-specific OCR */
|
2015-11-05 23:11:12 +08:00
|
|
|
#ifdef CONFIG_PM_SLEEP
|
mmc: fix all hangs related to mmc/sd card insert/removal during suspend/resume
If you don't use CONFIG_MMC_UNSAFE_RESUME, as soon as you attempt to
suspend, the card will be removed, therefore this patch doesn't change the
behavior of this option.
However the removal will be done by pm notifier, which runs while
userspace is still not frozen and thus can freely use del_gendisk, without
the risk of deadlock which would happen otherwise.
Card detect workqueue is now disabled while userspace is frozen, Therefore
if you do use CONFIG_MMC_UNSAFE_RESUME, and remove the card during
suspend, the removal will be detected as soon as userspace is unfrozen,
again at the moment it is safe to call del_gendisk.
Tested with and without CONFIG_MMC_UNSAFE_RESUME with suspend and hibernate.
[akpm@linux-foundation.org: clean up function prototype]
[akpm@linux-foundation.org: fix CONFIG_PM-n linkage, small cleanups]
[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
Cc: David Brownell <david-b@pacbell.net>
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-08-11 09:01:41 +08:00
|
|
|
struct notifier_block pm_notify;
|
2015-11-05 23:11:12 +08:00
|
|
|
#endif
|
2020-05-29 18:23:41 +08:00
|
|
|
struct wakeup_source *ws; /* Enable consume of uevents */
|
2012-07-04 13:31:48 +08:00
|
|
|
u32 max_current_330;
|
|
|
|
u32 max_current_300;
|
|
|
|
u32 max_current_180;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-03-17 10:39:00 +08:00
|
|
|
#define MMC_VDD_165_195 0x00000080 /* VDD voltage 1.65 - 1.95 */
|
2007-02-10 05:49:31 +08:00
|
|
|
#define MMC_VDD_20_21 0x00000100 /* VDD voltage 2.0 ~ 2.1 */
|
|
|
|
#define MMC_VDD_21_22 0x00000200 /* VDD voltage 2.1 ~ 2.2 */
|
|
|
|
#define MMC_VDD_22_23 0x00000400 /* VDD voltage 2.2 ~ 2.3 */
|
|
|
|
#define MMC_VDD_23_24 0x00000800 /* VDD voltage 2.3 ~ 2.4 */
|
|
|
|
#define MMC_VDD_24_25 0x00001000 /* VDD voltage 2.4 ~ 2.5 */
|
|
|
|
#define MMC_VDD_25_26 0x00002000 /* VDD voltage 2.5 ~ 2.6 */
|
|
|
|
#define MMC_VDD_26_27 0x00004000 /* VDD voltage 2.6 ~ 2.7 */
|
|
|
|
#define MMC_VDD_27_28 0x00008000 /* VDD voltage 2.7 ~ 2.8 */
|
|
|
|
#define MMC_VDD_28_29 0x00010000 /* VDD voltage 2.8 ~ 2.9 */
|
|
|
|
#define MMC_VDD_29_30 0x00020000 /* VDD voltage 2.9 ~ 3.0 */
|
|
|
|
#define MMC_VDD_30_31 0x00040000 /* VDD voltage 3.0 ~ 3.1 */
|
|
|
|
#define MMC_VDD_31_32 0x00080000 /* VDD voltage 3.1 ~ 3.2 */
|
|
|
|
#define MMC_VDD_32_33 0x00100000 /* VDD voltage 3.2 ~ 3.3 */
|
|
|
|
#define MMC_VDD_33_34 0x00200000 /* VDD voltage 3.3 ~ 3.4 */
|
|
|
|
#define MMC_VDD_34_35 0x00400000 /* VDD voltage 3.4 ~ 3.5 */
|
|
|
|
#define MMC_VDD_35_36 0x00800000 /* VDD voltage 3.5 ~ 3.6 */
|
|
|
|
|
2012-11-14 20:35:51 +08:00
|
|
|
u32 caps; /* Host capabilities */
|
2005-09-07 06:18:55 +08:00
|
|
|
|
|
|
|
#define MMC_CAP_4_BIT_DATA (1 << 0) /* Can the host do 4 bit transfers */
|
2008-07-06 07:10:27 +08:00
|
|
|
#define MMC_CAP_MMC_HIGHSPEED (1 << 1) /* Can do MMC high-speed timing */
|
|
|
|
#define MMC_CAP_SD_HIGHSPEED (1 << 2) /* Can do SD high-speed timing */
|
|
|
|
#define MMC_CAP_SDIO_IRQ (1 << 3) /* Can signal pending SDIO IRQs */
|
|
|
|
#define MMC_CAP_SPI (1 << 4) /* Talks only SPI protocols */
|
|
|
|
#define MMC_CAP_NEEDS_POLL (1 << 5) /* Needs polling for card-detection */
|
2008-11-17 20:35:21 +08:00
|
|
|
#define MMC_CAP_8_BIT_DATA (1 << 6) /* Can the host do 8 bit transfers */
|
2013-05-02 20:02:39 +08:00
|
|
|
#define MMC_CAP_AGGRESSIVE_PM (1 << 7) /* Suspend (e)MMC/SD at idle */
|
2009-09-23 07:44:32 +08:00
|
|
|
#define MMC_CAP_NONREMOVABLE (1 << 8) /* Nonremovable e.g. eMMC */
|
2009-09-23 07:44:34 +08:00
|
|
|
#define MMC_CAP_WAIT_WHILE_BUSY (1 << 9) /* Waits while card is busy */
|
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>
2017-01-25 19:04:17 +08:00
|
|
|
#define MMC_CAP_3_3V_DDR (1 << 11) /* Host supports eMMC DDR 3.3V */
|
|
|
|
#define MMC_CAP_1_8V_DDR (1 << 12) /* Host supports eMMC DDR 1.8V */
|
|
|
|
#define MMC_CAP_1_2V_DDR (1 << 13) /* Host supports eMMC DDR 1.2V */
|
2020-01-08 23:09:19 +08:00
|
|
|
#define MMC_CAP_DDR (MMC_CAP_3_3V_DDR | MMC_CAP_1_8V_DDR | \
|
|
|
|
MMC_CAP_1_2V_DDR)
|
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>
2017-01-25 19:04:17 +08:00
|
|
|
#define MMC_CAP_POWER_OFF_CARD (1 << 14) /* Can power off after boot */
|
|
|
|
#define MMC_CAP_BUS_WIDTH_TEST (1 << 15) /* CMD14/CMD19 bus width ok */
|
|
|
|
#define MMC_CAP_UHS_SDR12 (1 << 16) /* Host supports UHS SDR12 mode */
|
|
|
|
#define MMC_CAP_UHS_SDR25 (1 << 17) /* Host supports UHS SDR25 mode */
|
|
|
|
#define MMC_CAP_UHS_SDR50 (1 << 18) /* Host supports UHS SDR50 mode */
|
|
|
|
#define MMC_CAP_UHS_SDR104 (1 << 19) /* Host supports UHS SDR104 mode */
|
|
|
|
#define MMC_CAP_UHS_DDR50 (1 << 20) /* Host supports UHS DDR50 mode */
|
2018-04-27 19:47:14 +08:00
|
|
|
#define MMC_CAP_UHS (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | \
|
|
|
|
MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | \
|
|
|
|
MMC_CAP_UHS_DDR50)
|
2018-05-31 17:40:38 +08:00
|
|
|
#define MMC_CAP_SYNC_RUNTIME_PM (1 << 21) /* Synced runtime PM suspends. */
|
2020-03-10 19:49:43 +08:00
|
|
|
#define MMC_CAP_NEED_RSP_BUSY (1 << 22) /* Commands with R1B can't use R1. */
|
2011-05-05 14:48:59 +08:00
|
|
|
#define MMC_CAP_DRIVER_TYPE_A (1 << 23) /* Host supports Driver Type A */
|
|
|
|
#define MMC_CAP_DRIVER_TYPE_C (1 << 24) /* Host supports Driver Type C */
|
|
|
|
#define MMC_CAP_DRIVER_TYPE_D (1 << 25) /* Host supports Driver Type D */
|
2017-11-29 21:41:07 +08:00
|
|
|
#define MMC_CAP_DONE_COMPLETE (1 << 27) /* RW reqs can be completed within mmc_request_done() */
|
2017-06-13 20:07:51 +08:00
|
|
|
#define MMC_CAP_CD_WAKE (1 << 28) /* Enable card detect wake */
|
mmc: core: Add support for sending commands during data transfer
A host controller driver exposes its capability using caps flag
MMC_CAP_CMD_DURING_TFR. A driver with that capability can accept requests
that are marked mrq->cap_cmd_during_tfr = true. Then the driver informs the
upper layers when the command line is available for further commands by
calling mmc_command_done(). Because of that, the driver will not then
automatically send STOP commands, and it is the responsibility of the upper
layer to send a STOP command if it is required.
For requests submitted through the mmc_wait_for_req() interface, the caller
sets mrq->cap_cmd_during_tfr = true which causes mmc_wait_for_req() in fact
not to wait. The caller can then send commands that do not use the data
lines. Finally the caller can wait for the transfer to complete by calling
mmc_wait_for_req_done() which is now exported.
For requests submitted through the mmc_start_req() interface, the caller
again sets mrq->cap_cmd_during_tfr = true, but mmc_start_req() anyway does
not wait. The caller can then send commands that do not use the data
lines. Finally the caller can wait for the transfer to complete in the
normal way i.e. calling mmc_start_req() again.
Irrespective of how a cap_cmd_during_tfr request is started,
mmc_is_req_done() can be called if the upper layer needs to determine if
the request is done. However the appropriate waiting function (either
mmc_wait_for_req_done() or mmc_start_req()) must still be called.
The implementation consists primarily of a new completion
mrq->cmd_completion which notifies when the command line is available for
further commands. That completion is completed by mmc_command_done().
When there is an ongoing data transfer, calls to mmc_wait_for_req() will
automatically wait on that completion, so the caller does not have to do
anything special.
Note, in the case of errors, the driver may call mmc_request_done() without
calling mmc_command_done() because mmc_request_done() always calls
mmc_command_done().
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
2016-08-16 18:44:11 +08:00
|
|
|
#define MMC_CAP_CMD_DURING_TFR (1 << 29) /* Commands during data transfer */
|
2011-05-24 04:06:36 +08:00
|
|
|
#define MMC_CAP_CMD23 (1 << 30) /* CMD23 supported. */
|
2011-08-29 21:42:11 +08:00
|
|
|
#define MMC_CAP_HW_RESET (1 << 31) /* Hardware reset */
|
2005-09-07 06:18:55 +08:00
|
|
|
|
2012-11-14 20:35:51 +08:00
|
|
|
u32 caps2; /* More host capabilities */
|
2011-09-23 17:48:21 +08:00
|
|
|
|
|
|
|
#define MMC_CAP2_BOOTPART_NOACC (1 << 0) /* Boot partition no access */
|
2013-06-10 23:03:46 +08:00
|
|
|
#define MMC_CAP2_FULL_PWR_CYCLE (1 << 2) /* Can do full power cycle */
|
2020-07-07 19:58:42 +08:00
|
|
|
#define MMC_CAP2_FULL_PWR_CYCLE_IN_SUSPEND (1 << 3) /* Can do full power cycle in suspend */
|
2012-01-12 03:04:52 +08:00
|
|
|
#define MMC_CAP2_HS200_1_8V_SDR (1 << 5) /* can support */
|
|
|
|
#define MMC_CAP2_HS200_1_2V_SDR (1 << 6) /* can support */
|
|
|
|
#define MMC_CAP2_HS200 (MMC_CAP2_HS200_1_8V_SDR | \
|
|
|
|
MMC_CAP2_HS200_1_2V_SDR)
|
2012-05-01 21:49:52 +08:00
|
|
|
#define MMC_CAP2_CD_ACTIVE_HIGH (1 << 10) /* Card-detect signal active high */
|
|
|
|
#define MMC_CAP2_RO_ACTIVE_HIGH (1 << 11) /* Write-protect signal active high */
|
2013-04-04 21:41:06 +08:00
|
|
|
#define MMC_CAP2_NO_PRESCAN_POWERUP (1 << 14) /* Don't power up before scan */
|
2014-04-23 16:14:58 +08:00
|
|
|
#define MMC_CAP2_HS400_1_8V (1 << 15) /* Can support HS400 1.8V */
|
|
|
|
#define MMC_CAP2_HS400_1_2V (1 << 16) /* Can support HS400 1.2V */
|
|
|
|
#define MMC_CAP2_HS400 (MMC_CAP2_HS400_1_8V | \
|
|
|
|
MMC_CAP2_HS400_1_2V)
|
2018-04-27 19:47:14 +08:00
|
|
|
#define MMC_CAP2_HSX00_1_8V (MMC_CAP2_HS200_1_8V_SDR | MMC_CAP2_HS400_1_8V)
|
2014-11-06 21:19:05 +08:00
|
|
|
#define MMC_CAP2_HSX00_1_2V (MMC_CAP2_HS200_1_2V_SDR | MMC_CAP2_HS400_1_2V)
|
2014-04-25 19:55:30 +08:00
|
|
|
#define MMC_CAP2_SDIO_IRQ_NOTHREAD (1 << 17)
|
2015-05-07 02:31:19 +08:00
|
|
|
#define MMC_CAP2_NO_WRITE_PROTECT (1 << 18) /* No physical write protect pin, assume that card is always read-write */
|
2015-11-25 22:39:51 +08:00
|
|
|
#define MMC_CAP2_NO_SDIO (1 << 19) /* Do not send SDIO commands during initialization */
|
2016-05-26 09:56:12 +08:00
|
|
|
#define MMC_CAP2_HS400_ES (1 << 20) /* Host supports enhanced strobe */
|
2016-06-21 21:12:46 +08:00
|
|
|
#define MMC_CAP2_NO_SD (1 << 21) /* Do not send SD commands during initialization */
|
2016-07-01 15:45:28 +08:00
|
|
|
#define MMC_CAP2_NO_MMC (1 << 22) /* Do not send (e)MMC commands during initialization */
|
2017-08-25 20:43:46 +08:00
|
|
|
#define MMC_CAP2_CQE (1 << 23) /* Has eMMC command queue engine */
|
|
|
|
#define MMC_CAP2_CQE_DCMD (1 << 24) /* CQE can issue a direct command */
|
2018-04-14 05:54:57 +08:00
|
|
|
#define MMC_CAP2_AVOID_3_3V (1 << 25) /* Host must negotiate down from 3.3V */
|
2019-09-12 12:13:55 +08:00
|
|
|
#define MMC_CAP2_MERGE_CAPABLE (1 << 26) /* Host can merge a segment over the segment size */
|
2011-09-23 17:48:21 +08:00
|
|
|
|
2017-10-15 20:46:14 +08:00
|
|
|
int fixed_drv_type; /* fixed driver type for non-removable media */
|
|
|
|
|
2010-03-06 05:43:31 +08:00
|
|
|
mmc_pm_flag_t pm_caps; /* supported pm features */
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/* host specific block data */
|
|
|
|
unsigned int max_seg_size; /* see blk_queue_max_segment_size */
|
2010-09-10 13:33:59 +08:00
|
|
|
unsigned short max_segs; /* see blk_queue_max_segments */
|
2005-04-17 06:20:36 +08:00
|
|
|
unsigned short unused;
|
2006-11-22 00:55:45 +08:00
|
|
|
unsigned int max_req_size; /* maximum number of bytes in one req */
|
2006-11-22 00:54:23 +08:00
|
|
|
unsigned int max_blk_size; /* maximum size of one mmc block */
|
2006-11-22 00:55:45 +08:00
|
|
|
unsigned int max_blk_count; /* maximum number of blocks in one req */
|
2013-12-18 16:57:38 +08:00
|
|
|
unsigned int max_busy_timeout; /* max busy timeout in ms */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* private data */
|
2006-12-31 07:11:32 +08:00
|
|
|
spinlock_t lock; /* lock for claim and bus ops */
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
struct mmc_ios ios; /* current io bus settings */
|
|
|
|
|
2007-08-09 00:09:01 +08:00
|
|
|
/* group bitfields together to minimize padding */
|
|
|
|
unsigned int use_spi_crc:1;
|
|
|
|
unsigned int claimed:1; /* host exclusively claimed */
|
|
|
|
unsigned int bus_dead:1; /* bus has been released */
|
2015-05-07 18:10:12 +08:00
|
|
|
unsigned int can_retune:1; /* re-tuning can be used */
|
|
|
|
unsigned int doing_retune:1; /* re-tuning in progress */
|
|
|
|
unsigned int retune_now:1; /* do re-tuning at next req */
|
2016-05-16 20:35:24 +08:00
|
|
|
unsigned int retune_paused:1; /* re-tuning is temporarily disabled */
|
2017-11-29 21:41:02 +08:00
|
|
|
unsigned int use_blk_mq:1; /* use blk-mq */
|
2019-06-18 01:56:50 +08:00
|
|
|
unsigned int retune_crc_disable:1; /* don't trigger retune upon crc */
|
2019-08-28 20:35:43 +08:00
|
|
|
unsigned int can_dma_map_merge:1; /* merging can be used */
|
2007-08-09 00:09:01 +08:00
|
|
|
|
mmc: fix all hangs related to mmc/sd card insert/removal during suspend/resume
If you don't use CONFIG_MMC_UNSAFE_RESUME, as soon as you attempt to
suspend, the card will be removed, therefore this patch doesn't change the
behavior of this option.
However the removal will be done by pm notifier, which runs while
userspace is still not frozen and thus can freely use del_gendisk, without
the risk of deadlock which would happen otherwise.
Card detect workqueue is now disabled while userspace is frozen, Therefore
if you do use CONFIG_MMC_UNSAFE_RESUME, and remove the card during
suspend, the removal will be detected as soon as userspace is unfrozen,
again at the moment it is safe to call del_gendisk.
Tested with and without CONFIG_MMC_UNSAFE_RESUME with suspend and hibernate.
[akpm@linux-foundation.org: clean up function prototype]
[akpm@linux-foundation.org: fix CONFIG_PM-n linkage, small cleanups]
[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
Cc: David Brownell <david-b@pacbell.net>
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-08-11 09:01:41 +08:00
|
|
|
int rescan_disable; /* disable card detection */
|
2012-08-23 19:40:55 +08:00
|
|
|
int rescan_entered; /* used with nonremovable devices */
|
2009-09-23 07:44:29 +08:00
|
|
|
|
2015-05-07 18:10:12 +08:00
|
|
|
int need_retune; /* re-tuning is needed */
|
|
|
|
int hold_retune; /* hold off re-tuning */
|
|
|
|
unsigned int retune_period; /* re-tuning period in secs */
|
|
|
|
struct timer_list retune_timer; /* for periodic re-tuning */
|
|
|
|
|
2014-04-09 06:19:43 +08:00
|
|
|
bool trigger_card_event; /* card_event necessary */
|
|
|
|
|
2007-01-04 02:47:29 +08:00
|
|
|
struct mmc_card *card; /* device attached to this host */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
wait_queue_head_t wq;
|
2017-09-22 20:36:51 +08:00
|
|
|
struct mmc_ctx *claimer; /* context that has host claimed */
|
2009-09-23 07:44:30 +08:00
|
|
|
int claim_cnt; /* "claim" nesting count */
|
2017-09-22 20:36:51 +08:00
|
|
|
struct mmc_ctx default_ctx; /* default context */
|
2006-12-26 22:11:23 +08:00
|
|
|
|
2006-11-22 22:57:56 +08:00
|
|
|
struct delayed_work detect;
|
2011-11-28 22:22:00 +08:00
|
|
|
int detect_change; /* card detect flag */
|
2012-05-01 21:40:15 +08:00
|
|
|
struct mmc_slot slot;
|
2005-09-09 05:46:00 +08:00
|
|
|
|
2006-12-31 07:11:32 +08:00
|
|
|
const struct mmc_bus_ops *bus_ops; /* current bus driver */
|
|
|
|
unsigned int bus_refs; /* reference counter */
|
|
|
|
|
2007-06-30 22:29:41 +08:00
|
|
|
unsigned int sdio_irqs;
|
|
|
|
struct task_struct *sdio_irq_thread;
|
mmc: sdio: Add API to manage SDIO IRQs from a workqueue
For hosts not supporting MMC_CAP2_SDIO_IRQ_NOTHREAD but MMC_CAP_SDIO_IRQ,
the SDIO IRQs are processed from a dedicated kernel thread. For these
cases, the host calls mmc_signal_sdio_irq() from its ISR to signal a new
SDIO IRQ.
Signaling an SDIO IRQ makes the host's ->enable_sdio_irq() callback to be
invoked to temporary disable the IRQs, before the kernel thread is woken up
to process it. When processing of the IRQs are completed, they are
re-enabled by the kernel thread, again via invoking the host's
->enable_sdio_irq().
The observation from this, is that the execution path is being unnecessary
complex, as the host driver already knows that it needs to temporary
disable the IRQs before signaling a new one. Moreover, replacing the kernel
thread with a work/workqueue would not only greatly simplify the code, but
also make it more robust.
To address the above problems, let's continue to build upon the support for
MMC_CAP2_SDIO_IRQ_NOTHREAD, as it already implements SDIO IRQs to be
processed without using the clumsy kernel thread and without the ping-pong
calls of the host's ->enable_sdio_irq() callback for each processed IRQ.
Therefore, let's add new API sdio_signal_irq(), which enables hosts to
signal/process SDIO IRQs by using a work/workqueue, rather than using the
kernel thread.
Add also a new host callback ->ack_sdio_irq(), which the work invokes when
the SDIO IRQs have been processed. This informs the host about when it
shall re-enable the SDIO IRQs. Potentially, we could re-use the existing
->enable_sdio_irq() callback instead of adding a new one, however it has
turned out that it's more convenient for hosts to get this information via
a separate callback.
Hosts that wants to use this new method to signal/process SDIO IRQs, must
enable MMC_CAP2_SDIO_IRQ_NOTHREAD and implement the ->ack_sdio_irq()
callback.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
2017-04-13 22:48:11 +08:00
|
|
|
struct delayed_work sdio_irq_work;
|
2012-04-17 07:16:54 +08:00
|
|
|
bool sdio_irq_pending;
|
2007-06-30 22:29:41 +08:00
|
|
|
atomic_t sdio_irq_thread_abort;
|
|
|
|
|
2010-03-06 05:43:31 +08:00
|
|
|
mmc_pm_flag_t pm_flags; /* requested pm features */
|
|
|
|
|
2007-09-24 13:15:48 +08:00
|
|
|
struct led_trigger *led; /* activity led */
|
|
|
|
|
2010-09-29 13:08:27 +08:00
|
|
|
#ifdef CONFIG_REGULATOR
|
|
|
|
bool regulator_enabled; /* regulator state */
|
|
|
|
#endif
|
2012-06-20 14:28:43 +08:00
|
|
|
struct mmc_supply supply;
|
2010-09-29 13:08:27 +08:00
|
|
|
|
2008-07-24 20:18:57 +08:00
|
|
|
struct dentry *debugfs_root;
|
|
|
|
|
mmc: core: Add support for sending commands during data transfer
A host controller driver exposes its capability using caps flag
MMC_CAP_CMD_DURING_TFR. A driver with that capability can accept requests
that are marked mrq->cap_cmd_during_tfr = true. Then the driver informs the
upper layers when the command line is available for further commands by
calling mmc_command_done(). Because of that, the driver will not then
automatically send STOP commands, and it is the responsibility of the upper
layer to send a STOP command if it is required.
For requests submitted through the mmc_wait_for_req() interface, the caller
sets mrq->cap_cmd_during_tfr = true which causes mmc_wait_for_req() in fact
not to wait. The caller can then send commands that do not use the data
lines. Finally the caller can wait for the transfer to complete by calling
mmc_wait_for_req_done() which is now exported.
For requests submitted through the mmc_start_req() interface, the caller
again sets mrq->cap_cmd_during_tfr = true, but mmc_start_req() anyway does
not wait. The caller can then send commands that do not use the data
lines. Finally the caller can wait for the transfer to complete in the
normal way i.e. calling mmc_start_req() again.
Irrespective of how a cap_cmd_during_tfr request is started,
mmc_is_req_done() can be called if the upper layer needs to determine if
the request is done. However the appropriate waiting function (either
mmc_wait_for_req_done() or mmc_start_req()) must still be called.
The implementation consists primarily of a new completion
mrq->cmd_completion which notifies when the command line is available for
further commands. That completion is completed by mmc_command_done().
When there is an ongoing data transfer, calls to mmc_wait_for_req() will
automatically wait on that completion, so the caller does not have to do
anything special.
Note, in the case of errors, the driver may call mmc_request_done() without
calling mmc_command_done() because mmc_request_done() always calls
mmc_command_done().
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
2016-08-16 18:44:11 +08:00
|
|
|
/* Ongoing data transfer that allows commands during transfer */
|
|
|
|
struct mmc_request *ongoing_mrq;
|
|
|
|
|
2011-08-19 20:52:37 +08:00
|
|
|
#ifdef CONFIG_FAIL_MMC_REQUEST
|
|
|
|
struct fault_attr fail_mmc_request;
|
|
|
|
#endif
|
|
|
|
|
2011-11-04 20:53:19 +08:00
|
|
|
unsigned int actual_clock; /* Actual HC clock rate */
|
|
|
|
|
2013-03-05 11:24:52 +08:00
|
|
|
unsigned int slotno; /* used for sdio acpi binding */
|
|
|
|
|
2014-08-19 16:45:51 +08:00
|
|
|
int dsr_req; /* DSR value is valid */
|
|
|
|
u32 dsr; /* optional driver stage (DSR) value */
|
|
|
|
|
2017-08-25 20:43:46 +08:00
|
|
|
/* Command Queue Engine (CQE) support */
|
|
|
|
const struct mmc_cqe_ops *cqe_ops;
|
|
|
|
void *cqe_private;
|
|
|
|
int cqe_qdepth;
|
|
|
|
bool cqe_enabled;
|
|
|
|
bool cqe_on;
|
|
|
|
|
mmc: Add MMC host software queue support
Now the MMC read/write stack will always wait for previous request is
completed by mmc_blk_rw_wait(), before sending a new request to hardware,
or queue a work to complete request, that will bring context switching
overhead and spend some extra time to poll the card for busy completion
for I/O writes via sending CMD13, especially for high I/O per second
rates, to affect the IO performance.
Thus this patch introduces MMC software queue interface based on the
hardware command queue engine's interfaces, which is similar with the
hardware command queue engine's idea, that can remove the context
switching. Moreover we set the default queue depth as 64 for software
queue, which allows more requests to be prepared, merged and inserted
into IO scheduler to improve performance, but we only allow 2 requests
in flight, that is enough to let the irq handler always trigger the
next request without a context switch, as well as avoiding a long latency.
Moreover the host controller should support HW busy detection for I/O
operations when enabling the host software queue. That means, the host
controller must not complete a data transfer request, until after the
card stops signals busy.
From the fio testing data in cover letter, we can see the software
queue can improve some performance with 4K block size, increasing
about 16% for random read, increasing about 90% for random write,
though no obvious improvement for sequential read and write.
Moreover we can expand the software queue interface to support MMC
packed request or packed command in future.
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
Signed-off-by: Baolin Wang <baolin.wang7@gmail.com>
Link: https://lore.kernel.org/r/4409c1586a9b3ed20d57ad2faf6c262fc3ccb6e2.1581478568.git.baolin.wang7@gmail.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
2020-02-12 12:12:56 +08:00
|
|
|
/* Host Software Queue support */
|
|
|
|
bool hsq_enabled;
|
|
|
|
|
2020-02-27 06:31:25 +08:00
|
|
|
unsigned long private[] ____cacheline_aligned;
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2017-01-13 21:14:09 +08:00
|
|
|
struct device_node;
|
|
|
|
|
2013-02-15 23:13:53 +08:00
|
|
|
struct mmc_host *mmc_alloc_host(int extra, struct device *);
|
|
|
|
int mmc_add_host(struct mmc_host *);
|
|
|
|
void mmc_remove_host(struct mmc_host *);
|
|
|
|
void mmc_free_host(struct mmc_host *);
|
2013-06-10 04:14:11 +08:00
|
|
|
int mmc_of_parse(struct mmc_host *host);
|
2017-01-13 21:14:09 +08:00
|
|
|
int mmc_of_parse_voltage(struct device_node *np, u32 *mask);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2005-09-09 05:46:00 +08:00
|
|
|
static inline void *mmc_priv(struct mmc_host *host)
|
|
|
|
{
|
|
|
|
return (void *)host->private;
|
|
|
|
}
|
|
|
|
|
2019-02-03 16:27:00 +08:00
|
|
|
static inline struct mmc_host *mmc_from_priv(void *priv)
|
|
|
|
{
|
|
|
|
return container_of(priv, struct mmc_host, private);
|
|
|
|
}
|
|
|
|
|
2007-08-09 00:09:01 +08:00
|
|
|
#define mmc_host_is_spi(host) ((host)->caps & MMC_CAP_SPI)
|
|
|
|
|
2006-09-12 23:00:10 +08:00
|
|
|
#define mmc_dev(x) ((x)->parent)
|
2007-01-14 08:41:45 +08:00
|
|
|
#define mmc_classdev(x) (&(x)->class_dev)
|
2008-11-09 04:37:46 +08:00
|
|
|
#define mmc_hostname(x) (dev_name(&(x)->class_dev))
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2013-02-15 23:13:53 +08:00
|
|
|
void mmc_detect_change(struct mmc_host *, unsigned long delay);
|
|
|
|
void mmc_request_done(struct mmc_host *, struct mmc_request *);
|
mmc: core: Add support for sending commands during data transfer
A host controller driver exposes its capability using caps flag
MMC_CAP_CMD_DURING_TFR. A driver with that capability can accept requests
that are marked mrq->cap_cmd_during_tfr = true. Then the driver informs the
upper layers when the command line is available for further commands by
calling mmc_command_done(). Because of that, the driver will not then
automatically send STOP commands, and it is the responsibility of the upper
layer to send a STOP command if it is required.
For requests submitted through the mmc_wait_for_req() interface, the caller
sets mrq->cap_cmd_during_tfr = true which causes mmc_wait_for_req() in fact
not to wait. The caller can then send commands that do not use the data
lines. Finally the caller can wait for the transfer to complete by calling
mmc_wait_for_req_done() which is now exported.
For requests submitted through the mmc_start_req() interface, the caller
again sets mrq->cap_cmd_during_tfr = true, but mmc_start_req() anyway does
not wait. The caller can then send commands that do not use the data
lines. Finally the caller can wait for the transfer to complete in the
normal way i.e. calling mmc_start_req() again.
Irrespective of how a cap_cmd_during_tfr request is started,
mmc_is_req_done() can be called if the upper layer needs to determine if
the request is done. However the appropriate waiting function (either
mmc_wait_for_req_done() or mmc_start_req()) must still be called.
The implementation consists primarily of a new completion
mrq->cmd_completion which notifies when the command line is available for
further commands. That completion is completed by mmc_command_done().
When there is an ongoing data transfer, calls to mmc_wait_for_req() will
automatically wait on that completion, so the caller does not have to do
anything special.
Note, in the case of errors, the driver may call mmc_request_done() without
calling mmc_command_done() because mmc_request_done() always calls
mmc_command_done().
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
2016-08-16 18:44:11 +08:00
|
|
|
void mmc_command_done(struct mmc_host *host, struct mmc_request *mrq);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2017-09-22 20:36:52 +08:00
|
|
|
void mmc_cqe_request_done(struct mmc_host *host, struct mmc_request *mrq);
|
|
|
|
|
2019-09-08 18:12:26 +08:00
|
|
|
/*
|
|
|
|
* May be called from host driver's system/runtime suspend/resume callbacks,
|
|
|
|
* to know if SDIO IRQs has been claimed.
|
|
|
|
*/
|
|
|
|
static inline bool sdio_irq_claimed(struct mmc_host *host)
|
|
|
|
{
|
|
|
|
return host->sdio_irqs > 0;
|
|
|
|
}
|
|
|
|
|
2007-07-24 14:09:39 +08:00
|
|
|
static inline void mmc_signal_sdio_irq(struct mmc_host *host)
|
|
|
|
{
|
|
|
|
host->ops->enable_sdio_irq(host, 0);
|
2012-04-17 07:16:54 +08:00
|
|
|
host->sdio_irq_pending = true;
|
2015-07-10 11:36:45 +08:00
|
|
|
if (host->sdio_irq_thread)
|
|
|
|
wake_up_process(host->sdio_irq_thread);
|
2007-07-24 14:09:39 +08:00
|
|
|
}
|
|
|
|
|
mmc: sdio: Add API to manage SDIO IRQs from a workqueue
For hosts not supporting MMC_CAP2_SDIO_IRQ_NOTHREAD but MMC_CAP_SDIO_IRQ,
the SDIO IRQs are processed from a dedicated kernel thread. For these
cases, the host calls mmc_signal_sdio_irq() from its ISR to signal a new
SDIO IRQ.
Signaling an SDIO IRQ makes the host's ->enable_sdio_irq() callback to be
invoked to temporary disable the IRQs, before the kernel thread is woken up
to process it. When processing of the IRQs are completed, they are
re-enabled by the kernel thread, again via invoking the host's
->enable_sdio_irq().
The observation from this, is that the execution path is being unnecessary
complex, as the host driver already knows that it needs to temporary
disable the IRQs before signaling a new one. Moreover, replacing the kernel
thread with a work/workqueue would not only greatly simplify the code, but
also make it more robust.
To address the above problems, let's continue to build upon the support for
MMC_CAP2_SDIO_IRQ_NOTHREAD, as it already implements SDIO IRQs to be
processed without using the clumsy kernel thread and without the ping-pong
calls of the host's ->enable_sdio_irq() callback for each processed IRQ.
Therefore, let's add new API sdio_signal_irq(), which enables hosts to
signal/process SDIO IRQs by using a work/workqueue, rather than using the
kernel thread.
Add also a new host callback ->ack_sdio_irq(), which the work invokes when
the SDIO IRQs have been processed. This informs the host about when it
shall re-enable the SDIO IRQs. Potentially, we could re-use the existing
->enable_sdio_irq() callback instead of adding a new one, however it has
turned out that it's more convenient for hosts to get this information via
a separate callback.
Hosts that wants to use this new method to signal/process SDIO IRQs, must
enable MMC_CAP2_SDIO_IRQ_NOTHREAD and implement the ->ack_sdio_irq()
callback.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
2017-04-13 22:48:11 +08:00
|
|
|
void sdio_signal_irq(struct mmc_host *host);
|
2014-04-25 19:55:30 +08:00
|
|
|
|
2010-09-29 13:08:27 +08:00
|
|
|
#ifdef CONFIG_REGULATOR
|
|
|
|
int mmc_regulator_set_ocr(struct mmc_host *mmc,
|
|
|
|
struct regulator *supply,
|
|
|
|
unsigned short vdd_bit);
|
2015-10-12 20:48:25 +08:00
|
|
|
int mmc_regulator_set_vqmmc(struct mmc_host *mmc, struct mmc_ios *ios);
|
2010-09-29 13:08:27 +08:00
|
|
|
#else
|
|
|
|
static inline int mmc_regulator_set_ocr(struct mmc_host *mmc,
|
|
|
|
struct regulator *supply,
|
|
|
|
unsigned short vdd_bit)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
2015-10-12 20:48:25 +08:00
|
|
|
|
|
|
|
static inline int mmc_regulator_set_vqmmc(struct mmc_host *mmc,
|
|
|
|
struct mmc_ios *ios)
|
|
|
|
{
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
2010-09-29 13:08:27 +08:00
|
|
|
#endif
|
2009-03-11 19:30:43 +08:00
|
|
|
|
2014-05-07 06:57:01 +08:00
|
|
|
int mmc_regulator_get_supply(struct mmc_host *mmc);
|
|
|
|
|
2010-09-27 16:42:19 +08:00
|
|
|
static inline int mmc_card_is_removable(struct mmc_host *host)
|
|
|
|
{
|
2013-10-30 08:00:18 +08:00
|
|
|
return !(host->caps & MMC_CAP_NONREMOVABLE);
|
2010-09-27 16:42:19 +08:00
|
|
|
}
|
|
|
|
|
2011-04-05 22:43:20 +08:00
|
|
|
static inline int mmc_card_keep_power(struct mmc_host *host)
|
2010-11-28 13:21:29 +08:00
|
|
|
{
|
|
|
|
return host->pm_flags & MMC_PM_KEEP_POWER;
|
|
|
|
}
|
|
|
|
|
2011-04-05 22:43:21 +08:00
|
|
|
static inline int mmc_card_wake_sdio_irq(struct mmc_host *host)
|
|
|
|
{
|
|
|
|
return host->pm_flags & MMC_PM_WAKE_SDIO_IRQ;
|
|
|
|
}
|
2011-05-24 04:06:36 +08:00
|
|
|
|
2017-01-13 21:14:15 +08:00
|
|
|
/* TODO: Move to private header */
|
2014-04-23 16:07:35 +08:00
|
|
|
static inline int mmc_card_hs(struct mmc_card *card)
|
|
|
|
{
|
|
|
|
return card->host->ios.timing == MMC_TIMING_SD_HS ||
|
|
|
|
card->host->ios.timing == MMC_TIMING_MMC_HS;
|
|
|
|
}
|
|
|
|
|
2017-01-13 21:14:15 +08:00
|
|
|
/* TODO: Move to private header */
|
2014-04-23 16:07:35 +08:00
|
|
|
static inline int mmc_card_uhs(struct mmc_card *card)
|
|
|
|
{
|
|
|
|
return card->host->ios.timing >= MMC_TIMING_UHS_SDR12 &&
|
|
|
|
card->host->ios.timing <= MMC_TIMING_UHS_DDR50;
|
|
|
|
}
|
|
|
|
|
2015-05-07 18:10:12 +08:00
|
|
|
void mmc_retune_timer_stop(struct mmc_host *host);
|
|
|
|
|
|
|
|
static inline void mmc_retune_needed(struct mmc_host *host)
|
|
|
|
{
|
|
|
|
if (host->can_retune)
|
|
|
|
host->need_retune = 1;
|
|
|
|
}
|
|
|
|
|
2016-11-03 22:15:59 +08:00
|
|
|
static inline bool mmc_can_retune(struct mmc_host *host)
|
|
|
|
{
|
|
|
|
return host->can_retune == 1;
|
|
|
|
}
|
|
|
|
|
2018-08-30 07:32:05 +08:00
|
|
|
static inline bool mmc_doing_retune(struct mmc_host *host)
|
|
|
|
{
|
|
|
|
return host->doing_retune == 1;
|
|
|
|
}
|
|
|
|
|
2017-03-27 02:41:32 +08:00
|
|
|
static inline enum dma_data_direction mmc_get_dma_dir(struct mmc_data *data)
|
|
|
|
{
|
|
|
|
return data->flags & MMC_DATA_WRITE ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
|
|
|
|
}
|
|
|
|
|
2017-01-13 21:14:09 +08:00
|
|
|
int mmc_send_tuning(struct mmc_host *host, u32 opcode, int *cmd_error);
|
|
|
|
int mmc_abort_tuning(struct mmc_host *host, u32 opcode);
|
2016-05-16 20:35:24 +08:00
|
|
|
|
2011-05-28 04:04:03 +08:00
|
|
|
#endif /* LINUX_MMC_HOST_H */
|