Ejemplo n.º 1
0
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),
Ejemplo n.º 3
0
/*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");
            }
        }
    }
}