mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-19 02:34:01 +08:00
d6d50a15a2
This patch adds support for setting driver strength during UHS-I initialization procedure. Since UHS-I cards set S18A (bit 24) in response to ACMD41, we use this as a base for UHS-I initialization. We modify the parameter list of mmc_sd_get_cid() so that we can save the ROCR from ACMD41 to check whether bit 24 is set. We decide whether the Host Controller supports A, C, or D driver type depending on the Capabilities register. Driver type B is suported by default. We then set the appropriate driver type for the card using CMD6 mode 1. As per Host Controller spec v3.00, we set driver type for the host only if Preset Value Enable in the Host Control2 register is not set. SDHCI_HOST_CONTROL has been renamed to SDHCI_HOST_CONTROL1 to conform to the spec. 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>
78 lines
2.3 KiB
C
78 lines
2.3 KiB
C
/*
|
|
* linux/drivers/mmc/core/core.h
|
|
*
|
|
* Copyright (C) 2003 Russell King, All Rights Reserved.
|
|
* Copyright 2007 Pierre Ossman
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
#ifndef _MMC_CORE_CORE_H
|
|
#define _MMC_CORE_CORE_H
|
|
|
|
#include <linux/delay.h>
|
|
|
|
#define MMC_CMD_RETRIES 3
|
|
|
|
struct mmc_bus_ops {
|
|
int (*awake)(struct mmc_host *);
|
|
int (*sleep)(struct mmc_host *);
|
|
void (*remove)(struct mmc_host *);
|
|
void (*detect)(struct mmc_host *);
|
|
int (*suspend)(struct mmc_host *);
|
|
int (*resume)(struct mmc_host *);
|
|
int (*power_save)(struct mmc_host *);
|
|
int (*power_restore)(struct mmc_host *);
|
|
};
|
|
|
|
void mmc_attach_bus(struct mmc_host *host, const struct mmc_bus_ops *ops);
|
|
void mmc_detach_bus(struct mmc_host *host);
|
|
|
|
void mmc_init_erase(struct mmc_card *card);
|
|
|
|
void mmc_set_chip_select(struct mmc_host *host, int mode);
|
|
void mmc_set_clock(struct mmc_host *host, unsigned int hz);
|
|
void mmc_gate_clock(struct mmc_host *host);
|
|
void mmc_ungate_clock(struct mmc_host *host);
|
|
void mmc_set_ungated(struct mmc_host *host);
|
|
void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode);
|
|
void mmc_set_bus_width(struct mmc_host *host, unsigned int width);
|
|
void mmc_set_bus_width_ddr(struct mmc_host *host, unsigned int width,
|
|
unsigned int ddr);
|
|
u32 mmc_select_voltage(struct mmc_host *host, u32 ocr);
|
|
int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage);
|
|
void mmc_set_timing(struct mmc_host *host, unsigned int timing);
|
|
void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type);
|
|
|
|
static inline void mmc_delay(unsigned int ms)
|
|
{
|
|
if (ms < 1000 / HZ) {
|
|
cond_resched();
|
|
mdelay(ms);
|
|
} else {
|
|
msleep(ms);
|
|
}
|
|
}
|
|
|
|
void mmc_rescan(struct work_struct *work);
|
|
void mmc_start_host(struct mmc_host *host);
|
|
void mmc_stop_host(struct mmc_host *host);
|
|
|
|
int mmc_attach_mmc(struct mmc_host *host);
|
|
int mmc_attach_sd(struct mmc_host *host);
|
|
int mmc_attach_sdio(struct mmc_host *host);
|
|
|
|
/* Module parameters */
|
|
extern int use_spi_crc;
|
|
|
|
/* Debugfs information for hosts and cards */
|
|
void mmc_add_host_debugfs(struct mmc_host *host);
|
|
void mmc_remove_host_debugfs(struct mmc_host *host);
|
|
|
|
void mmc_add_card_debugfs(struct mmc_card *card);
|
|
void mmc_remove_card_debugfs(struct mmc_card *card);
|
|
|
|
#endif
|
|
|