summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Kapranov <kkapra@codeaurora.org>2018-11-09 15:49:57 +0100
committerLoic Poulain <loic.poulain@linaro.org>2018-12-07 19:35:38 +0100
commit16abfafcbdffc6c67316af29fd44c106097b9461 (patch)
treecd4e022d2f703287503bbb4d5fbf05fc5b621bbb
parent15a6532d9fe4ac14e376036eee792cf85c9ada57 (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.c4
-rw-r--r--platform/msm8996/include/platform/iomap.h1
-rw-r--r--platform/msm8996/msm8996-clock.c57
-rw-r--r--target/msm8996/init.c48
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!");