sdio: add sdio driver support on m8b

PD#141217: add sdio dirver support on m8b
ultra high speed SDR104 85M

test on m8b_m200.

Change-Id: I1aea3a8d77039be92e1759cb06eac96ed2915524
Signed-off-by: Nan Li <nan.li@amlogic.com>
This commit is contained in:
Nan Li
2017-05-12 17:53:04 +08:00
committed by Jianxin Pan
parent 940abdab8c
commit 75a88ba14c
7 changed files with 147 additions and 12 deletions

View File

@@ -499,17 +499,26 @@
};
sdhc_emmc_clk_cmd_pins:sdhc_emmc_clk_cmd_pins {
mux {
mux1 {
groups = "sdxc_clk_c",
"sdxc_cmd_c";
function = "sdxc_c";
input-enable;
bias-pull-up;
};
mux2 {
groups = "GPIOX_0",
"GPIOX_1",
"GPIOX_2",
"GPIOX_3",
"GPIOX_8",
"GPIOX_9";
function = "gpio";
};
};
sdhc_emmc_all_pins:sdhc_emmc_all_pins {
mux {
mux1 {
groups = "sdxc_d0_c",
"sdxc_d13_c",
"sdxc_d47_c",
@@ -519,6 +528,15 @@
input-enable;
bias-pull-up;
};
mux2 {
groups = "GPIOX_0",
"GPIOX_1",
"GPIOX_2",
"GPIOX_3",
"GPIOX_8",
"GPIOX_9";
function = "gpio";
};
};
sdhc_sd_clk_cmd_pins:sdhc_sd_clk_cmd_pins {
@@ -544,17 +562,31 @@
};
sdhc_sdio_clk_cmd_pins:sdhc_sdio_clk_cmd_pins {
mux {
mux1 {
groups = "sdxc_clk_a",
"sdxc_cmd_a";
function = "sdxc_a";
input-enable;
bias-pull-up;
};
mux2 {
groups = "BOOT_0",
"BOOT_1",
"BOOT_2",
"BOOT_3",
"BOOT_4",
"BOOT_5",
"BOOT_6",
"BOOT_7",
"BOOT_8",
"BOOT_10";
function = "gpio";
};
};
sdhc_sdio_all_pins:sdhc_sdio_all_pins {
mux {
mux1 {
groups = "sdxc_d0_1_a",
"sdxc_d13_1_a",
"sdxc_clk_a",
@@ -563,6 +595,19 @@
input-enable;
bias-pull-up;
};
mux2 {
groups = "BOOT_0",
"BOOT_1",
"BOOT_2",
"BOOT_3",
"BOOT_4",
"BOOT_5",
"BOOT_6",
"BOOT_7",
"BOOT_8",
"BOOT_10";
function = "gpio";
};
};
uart_a_pins: uart_a_pins {

View File

@@ -175,6 +175,42 @@
* other:reserved
*/
};
sdio {
status = "okay";
port = <3>;
/* 0:sdio_a,
* 1:sdio_b,
* 2:sdio_c,
* 3:sdhc_a,
* 4:sdhc_b,
* 5:sdhc_c
*/
pinname = "sdio";
ocr_avail = <0x00200080>;
/* 3.3:0x200000, 1.8+3.3:0x00200080 */
caps = "MMC_CAP_4_BIT_DATA",
"MMC_CAP_MMC_HIGHSPEED",
"MMC_CAP_SD_HIGHSPEED",
"MMC_CAP_NONREMOVABLE",
"MMC_CAP_UHS_SDR12",
"MMC_CAP_UHS_SDR25",
"MMC_CAP_UHS_SDR50",
"MMC_CAP_UHS_SDR104",
"MMC_PM_KEEP_POWER";
f_min = <300000>;
f_max = <100000000>;
max_req_size = <0x20000>; /* 128KB */
card_type = <3>;
/* 0:unknown,
* 1:mmc card(include eMMC),
* 2:sd card(include tSD),
* 3:sdio device(ie:sdio-wifi),
* 4:SD combo (IO+mem) card,
* 5:NON sdio device(means sd/mmc card),
* other:reserved
*/
};
};
cpufreq-meson{

View File

@@ -1000,15 +1000,15 @@ static void aml_sdhc_print_err(struct amlsd_host *host)
"Error: SDHC is gated clock,HHI_GCLK_MPEG0=%#x, bit14 is 0\n",
tmp_reg);
}
/* aml_dbg_print_pinmux();*/
#ifdef CONFIG_MMC_AML_DEBUG
aml_dbg_print_pinmux();
if (xfer_step == XFER_TIMER_TIMEOUT) { /* by aml_sdhc_timeout() */
sdhc_err("old sdhc reg:\n");
aml_sdhc_print_reg_(host->reg_buf);
}
aml_sdhc_print_reg(host);
#endif
/* aml_sdhc_print_reg(host);*/
}
/*error handler*/
@@ -1323,7 +1323,9 @@ static irqreturn_t aml_sdhc_irq(int irq, void *dev_id)
return IRQ_HANDLED;
}
WARN_ON(!mrq);
/* aml_sdhc_print_reg(host);*/
#ifdef CONFIG_MMC_AML_DEBUG
aml_sdhc_print_reg(host);
#endif
spin_unlock_irqrestore(&host->mrq_lock, flags);
return IRQ_HANDLED;
}

View File

@@ -545,7 +545,7 @@ timeout_handle:
aml_dbg_verify_pinmux(pdata);
aml_dbg_verify_pull_up(pdata);
aml_sdio_print_reg(host);
/* aml_dbg_print_pinmux(); */
aml_dbg_print_pinmux();
#endif
if (host->mrq->stop && aml_card_type_mmc(pdata) && !host->cmd_is_stop) {

View File

@@ -829,8 +829,48 @@ bool is_emmc_exist(struct amlsd_host *host) // is eMMC/tSD exist
return false;
}
/*-------------------debug---------------------*/
/*----sdhc----*/
void aml_sdhc_print_reg_(u32 *buf)
{
pr_info("***********SDHC_REGS***********\n");
pr_info("SDHC_ARGU: 0x%08x\n", buf[SDHC_ARGU/4]);
pr_info("SDHC_SEND: 0x%08x\n", buf[SDHC_SEND/4]);
pr_info("SDHC_CTRL: 0x%08x\n", buf[SDHC_CTRL/4]);
pr_info("SDHC_STAT: 0x%08x\n", buf[SDHC_STAT/4]);
pr_info("SDHC_CLKC: 0x%08x\n", buf[SDHC_CLKC/4]);
pr_info("SDHC_ADDR: 0x%08x\n", buf[SDHC_ADDR/4]);
pr_info("SDHC_PDMA: 0x%08x\n", buf[SDHC_PDMA/4]);
pr_info("SDHC_MISC: 0x%08x\n", buf[SDHC_MISC/4]);
pr_info("SDHC_DATA: 0x%08x\n", buf[SDHC_DATA/4]);
pr_info("SDHC_ICTL: 0x%08x\n", buf[SDHC_ICTL/4]);
pr_info("SDHC_ISTA: 0x%08x\n", buf[SDHC_ISTA/4]);
pr_info("SDHC_SRST: 0x%08x\n", buf[SDHC_SRST/4]);
pr_info("SDHC_ESTA: 0x%08x\n", buf[SDHC_ESTA/4]);
pr_info("SDHC_ENHC: 0x%08x\n", buf[SDHC_ENHC/4]);
pr_info("SDHC_CLK2: 0x%08x\n", buf[SDHC_CLK2/4]);
}
void aml_sdhc_print_reg(struct amlsd_host *host)
{
u32 buf[16];
memcpy_fromio(buf, host->base, 0x3C);
aml_sdhc_print_reg_(buf);
}
void aml_dbg_print_pinmux(void)
{
pr_info("Pinmux:\n");
pr_info("REG2 = 0x%08x\n", aml_read_cbus(PERIPHS_PIN_MUX_2));
pr_info("REG3 = 0x%08x\n", aml_read_cbus(PERIPHS_PIN_MUX_3));
pr_info("REG4 = 0x%08x\n", aml_read_cbus(PERIPHS_PIN_MUX_4));
pr_info("REG5 = 0x%08x\n", aml_read_cbus(PERIPHS_PIN_MUX_5));
pr_info("REG6 = 0x%08x\n", aml_read_cbus(PERIPHS_PIN_MUX_6));
pr_info("REG7 = 0x%08x\n", aml_read_cbus(PERIPHS_PIN_MUX_7));
pr_info("REG8 = 0x%08x\n", aml_read_cbus(PERIPHS_PIN_MUX_8));
}
/*-------------------debug---------------------*/
unsigned long sdhc_debug; // 0xffffffff;
static int __init sdhc_debug_setup(char *str)
{

View File

@@ -414,6 +414,17 @@ static struct meson_pmx_group meson8b_cbus_groups[] = {
GPIO_GROUP(DIF_4_P, 0),
GPIO_GROUP(DIF_4_N, 0),
GPIO_GROUP(BOOT_0, 0),
GPIO_GROUP(BOOT_1, 0),
GPIO_GROUP(BOOT_2, 0),
GPIO_GROUP(BOOT_3, 0),
GPIO_GROUP(BOOT_4, 0),
GPIO_GROUP(BOOT_5, 0),
GPIO_GROUP(BOOT_6, 0),
GPIO_GROUP(BOOT_7, 0),
GPIO_GROUP(BOOT_8, 0),
GPIO_GROUP(BOOT_10, 0),
/* bank X */
GROUP(sd_d0_a, 8, 5),
GROUP(sd_d1_a, 8, 4),

View File

@@ -168,8 +168,6 @@ extern int storage_flag;
extern void aml_debug_print_buf(char *buf, int size);
extern int aml_buf_verify(int *buf, int blocks, int lba);
extern void aml_sdhc_init_debugfs(struct mmc_host *mmc);
void aml_sdhc_print_reg_(u32 *buf);
extern void aml_sdhc_print_reg(struct amlsd_host *host);
extern void aml_sdio_init_debugfs(struct mmc_host *mmc);
extern void aml_sd_emmc_init_debugfs(struct mmc_host *mmc);
extern void aml_sdio_print_reg(struct amlsd_host *host);
@@ -179,6 +177,10 @@ extern int add_part_table(struct mtd_partition *part, unsigned int nr_part);
extern int add_emmc_partition(struct gendisk *disk);
#endif
#ifdef CONFIG_AMLOGIC_M8B_MMC
void aml_sdhc_print_reg_(u32 *buf);
extern void aml_sdhc_print_reg(struct amlsd_host *host);
void aml_dbg_print_pinmux(void);
extern size_t aml_sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,
void *buf, size_t buflen, int to_buffer);
#endif
@@ -214,7 +216,6 @@ bool is_emmc_exist(struct amlsd_host *host);
void aml_devm_pinctrl_put(struct amlsd_host *host);
/* void of_init_pins (struct amlsd_platform* pdata); */
void aml_dbg_print_pinmux(void);
#ifdef CONFIG_MMC_AML_DEBUG
void aml_dbg_verify_pull_up(struct amlsd_platform *pdata);
int aml_dbg_verify_pinmux(struct amlsd_platform *pdata);