static int mshci_hi_start_signal_voltage_switch(struct mshci_host *ms_host, struct mmc_ios *ios) { #if 1 struct himci_host *hi_host = (struct himci_host *)(ms_host->private); if (ms_host->quirks & MSHCI_QUIRK_EXTERNAL_CARD_DETECTION) { hi_host_trace(HIMCI_TRACE_SIGNIFICANT, "++"); himci_assert(ios); himci_assert(hi_host); hi_host_trace(HIMCI_TRACE_SIGNIFICANT, "old_sig_voltage = %d ", hi_host->old_sig_voltage); hi_host_trace(HIMCI_TRACE_SIGNIFICANT, "new_sig_voltage = %d ", ios->signal_voltage); hi_host_trace(HIMCI_TRACE_SIGNIFICANT, "allow_switch_signal_voltage = %d ", hi_host->allow_switch_signal_voltage); if (hi_host->allow_switch_signal_voltage && (hi_host->old_sig_voltage != ios->signal_voltage)) { switch (ios->signal_voltage) { case MMC_SIGNAL_VOLTAGE_330: #ifdef CONFIG_MACH_HI6620OEM printk("yuandan 330 \n"); hi_host->old_sig_voltage = ios->signal_voltage; /* 3.3V IO 设置 LDO7 2.85V LDO22 1.425V */ if(ms_host->quirks & MSHCI_QUIRK_EXTERNAL_CARD_DETECTION){ pmussi_reg_write(SOC_SMART_LDO7_REG_ADJ_ADDR(0),SDMMC_3V3_IO_LDO7_SSI_VALUE); pmussi_reg_write(SOC_SMART_ENABLE4_ADDR(0),BIT(SOC_SMART_ENABLE4_en_ldo22_int_START)); } sd_ldo22_need_control = 0; #endif break; case MMC_SIGNAL_VOLTAGE_180: #ifdef CONFIG_MACH_HI6620OEM printk("yuandan 180 \n"); hi_host->old_sig_voltage = ios->signal_voltage; /* 1.8V IO 设置 LDO7 1.8V LDO22 0V */ if(ms_host->quirks & MSHCI_QUIRK_EXTERNAL_CARD_DETECTION){ pmussi_reg_write(SOC_SMART_LDO7_REG_ADJ_ADDR(0),SDMMC_1V8_IO_LDO7_SSI_VALUE); udelay(30); pmussi_reg_write(SOC_SMART_DR1_ISET_ADDR(0), SDMMC_DR1_ISET_SSI_VALUE);/* DR1 current control */ pmussi_reg_write(SOC_SMART_DR2_ISET_ADDR(0), SDMMC_DR2_ISET_SSI_VALUE);/* DR2 current control */ pmussi_reg_write(SOC_SMART_DR_BRE_CTRL_ADDR(0), SDMMC_DR_CONTROL_SSI_VALUE);/* Turn on DR1 DR2 */ pmussi_reg_write(SOC_SMART_DISABLE4_ADDR(0),BIT(SOC_SMART_DISABLE4_dis_ldo22_int_START)); } sd_ldo22_need_control = 1; #endif break; case MMC_SIGNAL_VOLTAGE_120: /* FIXME */ /* 1.20v is not support */ himci_error("1.20V is not supported"); break; default: himci_error("unknown signal voltage"); break; } } hi_host_trace(HIMCI_TRACE_SIGNIFICANT, "--"); } #endif return 0; }
SOC_SMART_DISABLE2_LDO1_8_dis_ldo7_int_START, (SOC_SMART_DISABLE2_LDO1_8_dis_ldo7_int_END-SOC_SMART_DISABLE2_LDO1_8_dis_ldo7_int_START+1), }, { SOC_SMART_ONOFF_STATUS2_LDO1_8_ADDR(0), SOC_SMART_ONOFF_STATUS2_LDO1_8_st_ldo7_int_START, (SOC_SMART_ONOFF_STATUS2_LDO1_8_st_ldo7_int_END-SOC_SMART_ONOFF_STATUS2_LDO1_8_st_ldo7_int_START+1), }, }, PMU_SWITCH_ON,/*bat switch init state*/ }, { ldo7_set, sizeof(ldo7_set)/sizeof(BSP_U32), { SOC_SMART_LDO7_REG_ADJ_ADDR(0), SOC_SMART_LDO7_REG_ADJ_vset_ldo7_START, (SOC_SMART_LDO7_REG_ADJ_vset_ldo7_END-SOC_SMART_LDO7_REG_ADJ_vset_ldo7_START+1), }, }, }, { LDO8_ID, LDO8_NAME, { { { SOC_SMART_ENABLE2_LDO1_8_ADDR(0), SOC_SMART_ENABLE2_LDO1_8_en_ldo8_int_START, (SOC_SMART_ENABLE2_LDO1_8_en_ldo8_int_END-SOC_SMART_ENABLE2_LDO1_8_en_ldo8_int_START+1),
/*NOT called by VIA*/ static void mshci_sd_power_onoff(struct mshci_host *ms_host,int ispowerup) { struct himci_host * hi_host = (struct himci_host *)(ms_host->private); int ret = 0; if (sd_ldo22_need_control){/* during power-on or power-off,need to restore sd io if necessary */ pmussi_reg_write(SOC_SMART_ENABLE4_ADDR(0),BIT(SOC_SMART_ENABLE4_en_ldo22_int_START)); udelay(30); pmussi_reg_write(SOC_SMART_LDO7_REG_ADJ_ADDR(0),SDMMC_3V3_IO_LDO7_SSI_VALUE); sd_ldo22_need_control = 0; } if (ispowerup){ udelay(30); if (hi_host->signal_vcc){ ret = regulator_enable(hi_host->signal_vcc); if (ret) { himci_error("failed to regulator_enable"); } } udelay(30); if (hi_host->vcc_lvs){ ret = regulator_enable(hi_host->vcc_lvs); if (ret) { himci_error("failed to regulator_enable"); } } if (hi_host->vcc_ldo) { ret = regulator_set_voltage(hi_host->vcc_ldo, SDMMC_SDCARD_285, SDMMC_SDCARD_285); if (ret != 0) { himci_error("failed to LDO10 regulator_set_voltage 2.85 \n"); } } if (hi_host->vcc_ldo){ ret = regulator_enable(hi_host->vcc_ldo); if (ret) { himci_error("failed to regulator_enable"); } } ret = blockmux_set(hi_host->piomux_block, hi_host->pblock_config, NORMAL); if (ret) { himci_error("failed to blockmux_set"); } } else{ ret = blockmux_set(hi_host->piomux_block, hi_host->pblock_config, LOWPOWER); if (ret) { himci_error("failed to blockmux_set"); } mshci_sd_lowpower(); if (hi_host->vcc_ldo){ ret = regulator_disable(hi_host->vcc_ldo); if (ret) { himci_error("failed to regulator_disable LDO10"); } } if (hi_host->vcc_lvs){ ret = regulator_disable(hi_host->vcc_lvs); if (ret) { himci_error("failed to regulator_disable LDO7"); } } udelay(30); if (hi_host->signal_vcc){ ret = regulator_disable(hi_host->signal_vcc); if (ret) { himci_error("failed to regulator_disable LDO22"); } } } }