#include <linux/slab.h>
#include <linux/export.h>
#include <linux/types.h>
#include <linux/scatterlist.h>
#include <linux/mmc/host.h>
#include <linux/mmc/card.h>
#include <linux/mmc/mmc.h>
#include "core.h"
#include "card.h"
#include "host.h"
#include "mmc_ops.h"
#define MMC_BKOPS_TIMEOUT_MS …
#define MMC_SANITIZE_TIMEOUT_MS …
#define MMC_OP_COND_PERIOD_US …
#define MMC_OP_COND_TIMEOUT_MS …
static const u8 tuning_blk_pattern_4bit[] = …;
static const u8 tuning_blk_pattern_8bit[] = …;
struct mmc_busy_data { … };
struct mmc_op_cond_busy_data { … };
int __mmc_send_status(struct mmc_card *card, u32 *status, unsigned int retries)
{ … }
EXPORT_SYMBOL_GPL(…);
int mmc_send_status(struct mmc_card *card, u32 *status)
{ … }
EXPORT_SYMBOL_GPL(…);
static int _mmc_select_card(struct mmc_host *host, struct mmc_card *card)
{ … }
int mmc_select_card(struct mmc_card *card)
{ … }
int mmc_deselect_cards(struct mmc_host *host)
{ … }
int mmc_set_dsr(struct mmc_host *host)
{ … }
int mmc_go_idle(struct mmc_host *host)
{ … }
static int __mmc_send_op_cond_cb(void *cb_data, bool *busy)
{ … }
int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
{ … }
int mmc_set_relative_addr(struct mmc_card *card)
{ … }
static int
mmc_send_cxd_native(struct mmc_host *host, u32 arg, u32 *cxd, int opcode)
{ … }
int mmc_send_adtc_data(struct mmc_card *card, struct mmc_host *host, u32 opcode,
u32 args, void *buf, unsigned len)
{ … }
static int mmc_spi_send_cxd(struct mmc_host *host, u32 *cxd, u32 opcode)
{ … }
int mmc_send_csd(struct mmc_card *card, u32 *csd)
{ … }
int mmc_send_cid(struct mmc_host *host, u32 *cid)
{ … }
int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd)
{ … }
EXPORT_SYMBOL_GPL(…);
int mmc_spi_read_ocr(struct mmc_host *host, int highcap, u32 *ocrp)
{ … }
int mmc_spi_set_crc(struct mmc_host *host, int use_crc)
{ … }
static int mmc_switch_status_error(struct mmc_host *host, u32 status)
{ … }
int mmc_switch_status(struct mmc_card *card, bool crc_err_fatal)
{ … }
static int mmc_busy_cb(void *cb_data, bool *busy)
{ … }
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int period_us,
unsigned int timeout_ms,
int (*busy_cb)(void *cb_data, bool *busy),
void *cb_data)
{ … }
EXPORT_SYMBOL_GPL(…);
int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
bool retry_crc_err, enum mmc_busy_cmd busy_cmd)
{ … }
EXPORT_SYMBOL_GPL(…);
bool mmc_prepare_busy_cmd(struct mmc_host *host, struct mmc_command *cmd,
unsigned int timeout_ms)
{ … }
EXPORT_SYMBOL_GPL(…);
int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
unsigned int timeout_ms, unsigned char timing,
bool send_status, bool retry_crc_err, unsigned int retries)
{ … }
int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
unsigned int timeout_ms)
{ … }
EXPORT_SYMBOL_GPL(…);
int mmc_send_tuning(struct mmc_host *host, u32 opcode, int *cmd_error)
{ … }
EXPORT_SYMBOL_GPL(…);
int mmc_send_abort_tuning(struct mmc_host *host, u32 opcode)
{ … }
EXPORT_SYMBOL_GPL(…);
static int
mmc_send_bus_test(struct mmc_card *card, struct mmc_host *host, u8 opcode,
u8 len)
{ … }
int mmc_bus_test(struct mmc_card *card, u8 bus_width)
{ … }
static int mmc_send_hpi_cmd(struct mmc_card *card)
{ … }
static int mmc_interrupt_hpi(struct mmc_card *card)
{ … }
int mmc_can_ext_csd(struct mmc_card *card)
{ … }
static int mmc_read_bkops_status(struct mmc_card *card)
{ … }
void mmc_run_bkops(struct mmc_card *card)
{ … }
EXPORT_SYMBOL(…);
static int mmc_cmdq_switch(struct mmc_card *card, bool enable)
{ … }
int mmc_cmdq_enable(struct mmc_card *card)
{ … }
EXPORT_SYMBOL_GPL(…);
int mmc_cmdq_disable(struct mmc_card *card)
{ … }
EXPORT_SYMBOL_GPL(…);
int mmc_sanitize(struct mmc_card *card, unsigned int timeout_ms)
{ … }
EXPORT_SYMBOL_GPL(…);