mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
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:
@@ -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 {
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user