diff options
author | Kirill Kapranov <kkapra@codeaurora.org> | 2018-11-09 15:49:57 +0100 |
---|---|---|
committer | Loic Poulain <loic.poulain@linaro.org> | 2018-12-07 19:35:38 +0100 |
commit | 16abfafcbdffc6c67316af29fd44c106097b9461 (patch) | |
tree | cd4e022d2f703287503bbb4d5fbf05fc5b621bbb | |
parent | 15a6532d9fe4ac14e376036eee792cf85c9ada57 (diff) |
Enable SD card boot feature
Change-Id: I3b26250ee1eea289c5069996af3984f1bcd3e506
Signed-off-by: Tanya Finkel <tfinkel@codeaurora.org>
Signed-off-by: Kirill Kapranov <kkapra@codeaurora.org>
Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
-rw-r--r-- | platform/msm8996/acpuclock.c | 4 | ||||
-rw-r--r-- | platform/msm8996/include/platform/iomap.h | 1 | ||||
-rw-r--r-- | platform/msm8996/msm8996-clock.c | 57 | ||||
-rw-r--r-- | target/msm8996/init.c | 48 |
4 files changed, 99 insertions, 11 deletions
diff --git a/platform/msm8996/acpuclock.c b/platform/msm8996/acpuclock.c index c74e2e6a..6e6613eb 100644 --- a/platform/msm8996/acpuclock.c +++ b/platform/msm8996/acpuclock.c @@ -98,6 +98,10 @@ void clock_config_mmc(uint32_t interface, uint32_t freq) { ret = clk_get_set_enable(clk_name, 192000000, true); } + else if(freq == MMC_CLK_200MHZ) + { + ret = clk_get_set_enable(clk_name, 200000000, 1); + } else if(freq == MMC_CLK_400MHZ) { ret = clk_get_set_enable(clk_name, 384000000, 1); diff --git a/platform/msm8996/include/platform/iomap.h b/platform/msm8996/include/platform/iomap.h index 8945b981..4d9a1f32 100644 --- a/platform/msm8996/include/platform/iomap.h +++ b/platform/msm8996/include/platform/iomap.h @@ -215,6 +215,7 @@ unsigned int usb_phy_bcr(); /* DRV strength for sdcc */ #define SDC1_HDRV_PULL_CTL (TLMM_BASE_ADDR + 0x0012C000) +#define SDC2_HDRV_PULL_CTL (TLMM_BASE_ADDR + 0x0012D000) /* SDHCI - power control registers */ #define SDCC_MCI_HC_MODE (0x00000078) diff --git a/platform/msm8996/msm8996-clock.c b/platform/msm8996/msm8996-clock.c index c92974a3..31aa0477 100644 --- a/platform/msm8996/msm8996-clock.c +++ b/platform/msm8996/msm8996-clock.c @@ -286,6 +286,19 @@ static struct clk_freq_tbl ftbl_gcc_sdcc1_4_apps_clk[] = F_END }; +static struct clk_freq_tbl ftbl_gcc_sdcc2_4_apps_clk[] = +{ + F( 144000, cxo, 16, 3, 25), + F( 400000, cxo, 12, 1, 4), + F( 20000000, gpll0, 15, 1, 2), + F( 25000000, gpll0, 12, 1, 2), + F( 50000000, gpll0, 12, 0, 0), + F(100000000, gpll0, 6, 0, 0), + F(200000000, gpll0, 3, 0, 0), + F_END +}; + + static struct rcg_clk sdcc1_apps_clk_src = { .cmd_reg = (uint32_t *) SDCC1_CMD_RCGR, @@ -326,6 +339,47 @@ static struct branch_clk gcc_sdcc1_ahb_clk = }, }; +static struct rcg_clk sdcc2_apps_clk_src = +{ + .cmd_reg = (uint32_t *) SDCC2_CMD_RCGR, + .cfg_reg = (uint32_t *) SDCC2_CFG_RCGR, + .m_reg = (uint32_t *) SDCC2_M, + .n_reg = (uint32_t *) SDCC2_N, + .d_reg = (uint32_t *) SDCC2_D, + + .set_rate = clock_lib2_rcg_set_rate_mnd, + .freq_tbl = ftbl_gcc_sdcc2_4_apps_clk, + .current_freq = &rcg_dummy_freq, + + .c = { + .dbg_name = "sdc2_clk", + .ops = &clk_ops_rcg_mnd, + }, +}; + +static struct branch_clk gcc_sdcc2_apps_clk = +{ + .cbcr_reg = (uint32_t *) SDCC2_APPS_CBCR, + .parent = &sdcc2_apps_clk_src.c, + + .c = { + .dbg_name = "gcc_sdcc2_apps_clk", + .ops = &clk_ops_branch, + }, +}; + +static struct branch_clk gcc_sdcc2_ahb_clk = +{ + .cbcr_reg = (uint32_t *) SDCC2_AHB_CBCR, + .has_sibling = 1, + + .c = { + .dbg_name = "gcc_sdcc2_ahb_clk", + .ops = &clk_ops_branch, + }, +}; + + static struct branch_clk gcc_sys_noc_usb30_axi_clk = { .cbcr_reg = (uint32_t *) SYS_NOC_USB3_AXI_CBCR, .has_sibling = 1, @@ -893,6 +947,9 @@ static struct clk_lookup msm_msm8996_clocks[] = CLK_LOOKUP("sdc1_iface_clk", gcc_sdcc1_ahb_clk.c), CLK_LOOKUP("sdc1_core_clk", gcc_sdcc1_apps_clk.c), + CLK_LOOKUP("sdc2_iface_clk", gcc_sdcc2_ahb_clk.c), + CLK_LOOKUP("sdc2_core_clk", gcc_sdcc2_apps_clk.c), + CLK_LOOKUP("uart8_iface_clk", gcc_blsp2_ahb_clk.c), CLK_LOOKUP("uart8_core_clk", gcc_blsp2_uart2_apps_clk.c), diff --git a/target/msm8996/init.c b/target/msm8996/init.c index 909448e9..a577c50d 100644 --- a/target/msm8996/init.c +++ b/target/msm8996/init.c @@ -98,7 +98,8 @@ enum FUSION_I2S_CDP = 2, } cdp_subtype; -static void set_sdc_power_ctrl(void); +static uint8_t flash_memory_slot = 0; +static void set_sdc_power_ctrl(); static uint32_t mmc_pwrctl_base[] = { MSM_SDC1_BASE, MSM_SDC2_BASE }; @@ -204,25 +205,45 @@ void target_uninit(void) static void set_sdc_power_ctrl() { + uint32_t reg = 0; + uint8_t clk = 0; + uint8_t cmd = 0; + uint8_t dat = 0; + + if (flash_memory_slot == 0x1) + { + clk = TLMM_CUR_VAL_10MA; + cmd = TLMM_CUR_VAL_8MA; + dat = TLMM_CUR_VAL_8MA; + reg = SDC1_HDRV_PULL_CTL; + } + else if (flash_memory_slot == 0x2) + { + clk = TLMM_CUR_VAL_16MA; + cmd = TLMM_CUR_VAL_10MA; + dat = TLMM_CUR_VAL_10MA; + reg = SDC2_HDRV_PULL_CTL; + } + /* Drive strength configs for sdc pins */ struct tlmm_cfgs sdc1_hdrv_cfg[] = { - { SDC1_CLK_HDRV_CTL_OFF, TLMM_CUR_VAL_16MA, TLMM_HDRV_MASK, SDC1_HDRV_PULL_CTL }, - { SDC1_CMD_HDRV_CTL_OFF, TLMM_CUR_VAL_10MA, TLMM_HDRV_MASK, SDC1_HDRV_PULL_CTL }, - { SDC1_DATA_HDRV_CTL_OFF, TLMM_CUR_VAL_10MA, TLMM_HDRV_MASK, SDC1_HDRV_PULL_CTL }, + { SDC1_CLK_HDRV_CTL_OFF, clk, TLMM_HDRV_MASK, reg }, + { SDC1_CMD_HDRV_CTL_OFF, cmd, TLMM_HDRV_MASK, reg }, + { SDC1_DATA_HDRV_CTL_OFF, dat, TLMM_HDRV_MASK, reg }, }; /* Pull configs for sdc pins */ struct tlmm_cfgs sdc1_pull_cfg[] = { - { SDC1_CLK_PULL_CTL_OFF, TLMM_NO_PULL, TLMM_PULL_MASK, SDC1_HDRV_PULL_CTL }, - { SDC1_CMD_PULL_CTL_OFF, TLMM_PULL_UP, TLMM_PULL_MASK, SDC1_HDRV_PULL_CTL }, - { SDC1_DATA_PULL_CTL_OFF, TLMM_PULL_UP, TLMM_PULL_MASK, SDC1_HDRV_PULL_CTL }, + { SDC1_CLK_PULL_CTL_OFF, TLMM_NO_PULL, TLMM_PULL_MASK, reg }, + { SDC1_CMD_PULL_CTL_OFF, TLMM_PULL_UP, TLMM_PULL_MASK, reg }, + { SDC1_DATA_PULL_CTL_OFF, TLMM_PULL_UP, TLMM_PULL_MASK, reg }, }; struct tlmm_cfgs sdc1_rclk_cfg[] = { - { SDC1_RCLK_PULL_CTL_OFF, TLMM_PULL_DOWN, TLMM_PULL_MASK, SDC1_HDRV_PULL_CTL }, + { SDC1_RCLK_PULL_CTL_OFF, TLMM_PULL_DOWN, TLMM_PULL_MASK, reg }, }; /* Set the drive strength & pull control values */ @@ -245,28 +266,33 @@ void target_sdc_init() { struct mmc_config_data config = {0}; - /* Set drive strength & pull ctrl values */ - set_sdc_power_ctrl(); - config.bus_width = DATA_BUS_WIDTH_8BIT; config.max_clk_rate = MMC_CLK_192MHZ; config.hs400_support = 1; /* Try slot 1*/ + flash_memory_slot = 1; config.slot = 1; config.sdhc_base = mmc_sdhci_base[config.slot - 1]; config.pwrctl_base = mmc_pwrctl_base[config.slot - 1]; config.pwr_irq = mmc_sdc_pwrctl_irq[config.slot - 1]; + /* Set drive strength & pull ctrl values */ + set_sdc_power_ctrl(); + if (!(dev = mmc_init(&config))) { /* Try slot 2 */ + flash_memory_slot = 2; config.slot = 2; config.max_clk_rate = MMC_CLK_200MHZ; config.sdhc_base = mmc_sdhci_base[config.slot - 1]; config.pwrctl_base = mmc_pwrctl_base[config.slot - 1]; config.pwr_irq = mmc_sdc_pwrctl_irq[config.slot - 1]; + /* Set drive strength & pull ctrl values */ + set_sdc_power_ctrl(); + if (!(dev = mmc_init(&config))) { dprintf(CRITICAL, "mmc init failed!"); |