diff --git a/arch/arm/boot/dts/amlogic/meson8b.dtsi b/arch/arm/boot/dts/amlogic/meson8b.dtsi index 020b1f6fe3f5..5bc98e8f4a0c 100644 --- a/arch/arm/boot/dts/amlogic/meson8b.dtsi +++ b/arch/arm/boot/dts/amlogic/meson8b.dtsi @@ -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 { diff --git a/arch/arm/boot/dts/amlogic/meson8b_m200.dts b/arch/arm/boot/dts/amlogic/meson8b_m200.dts index bb881c103b98..e29004a3acbe 100644 --- a/arch/arm/boot/dts/amlogic/meson8b_m200.dts +++ b/arch/arm/boot/dts/amlogic/meson8b_m200.dts @@ -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{ diff --git a/drivers/amlogic/mmc/aml_sdhc_m8.c b/drivers/amlogic/mmc/aml_sdhc_m8.c index 36c1077ec2fb..e8298aaeb632 100644 --- a/drivers/amlogic/mmc/aml_sdhc_m8.c +++ b/drivers/amlogic/mmc/aml_sdhc_m8.c @@ -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; } diff --git a/drivers/amlogic/mmc/aml_sdio.c b/drivers/amlogic/mmc/aml_sdio.c index 59d9fc8c70c4..44a3f1f51de8 100644 --- a/drivers/amlogic/mmc/aml_sdio.c +++ b/drivers/amlogic/mmc/aml_sdio.c @@ -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) { diff --git a/drivers/amlogic/mmc/amlsd.c b/drivers/amlogic/mmc/amlsd.c index 8eb0e3005fd8..12b995acebd8 100644 --- a/drivers/amlogic/mmc/amlsd.c +++ b/drivers/amlogic/mmc/amlsd.c @@ -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) { diff --git a/drivers/amlogic/pinctrl/pinctrl-meson8b.c b/drivers/amlogic/pinctrl/pinctrl-meson8b.c index 89e2b1ad6e90..df6819fa7be2 100644 --- a/drivers/amlogic/pinctrl/pinctrl-meson8b.c +++ b/drivers/amlogic/pinctrl/pinctrl-meson8b.c @@ -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), diff --git a/include/linux/amlogic/amlsd.h b/include/linux/amlogic/amlsd.h index 9323c5cda6ed..af2c925e80e3 100644 --- a/include/linux/amlogic/amlsd.h +++ b/include/linux/amlogic/amlsd.h @@ -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);