diff options
Diffstat (limited to 'drivers/mfd/rtl8411.c')
| -rw-r--r-- | drivers/mfd/rtl8411.c | 101 | 
1 files changed, 55 insertions, 46 deletions
diff --git a/drivers/mfd/rtl8411.c b/drivers/mfd/rtl8411.c index 52801351864..fdd34c883d8 100644 --- a/drivers/mfd/rtl8411.c +++ b/drivers/mfd/rtl8411.c @@ -49,8 +49,8 @@ static int rtl8411b_is_qfn48(struct rtsx_pcr *pcr)  static void rtl8411_fetch_vendor_settings(struct rtsx_pcr *pcr)  { -	u32 reg1; -	u8 reg3; +	u32 reg1 = 0; +	u8 reg3 = 0;  	rtsx_pci_read_config_dword(pcr, PCR_SETTING_REG1, ®1);  	dev_dbg(&(pcr->pci->dev), "Cfg 0x%x: 0x%x\n", PCR_SETTING_REG1, reg1); @@ -71,7 +71,7 @@ static void rtl8411_fetch_vendor_settings(struct rtsx_pcr *pcr)  static void rtl8411b_fetch_vendor_settings(struct rtsx_pcr *pcr)  { -	u32 reg; +	u32 reg = 0;  	rtsx_pci_read_config_dword(pcr, PCR_SETTING_REG1, ®);  	dev_dbg(&(pcr->pci->dev), "Cfg 0x%x: 0x%x\n", PCR_SETTING_REG1, reg); @@ -191,24 +191,25 @@ static int rtl8411_card_power_off(struct rtsx_pcr *pcr, int card)  			BPP_LDO_POWB, BPP_LDO_SUSPEND);  } -static int rtl8411_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage) +static int rtl8411_do_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage, +		int bpp_tuned18_shift, int bpp_asic_1v8)  {  	u8 mask, val;  	int err; -	mask = (BPP_REG_TUNED18 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_MASK; +	mask = (BPP_REG_TUNED18 << bpp_tuned18_shift) | BPP_PAD_MASK;  	if (voltage == OUTPUT_3V3) {  		err = rtsx_pci_write_register(pcr,  				SD30_DRIVE_SEL, 0x07, pcr->sd30_drive_sel_3v3);  		if (err < 0)  			return err; -		val = (BPP_ASIC_3V3 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_3V3; +		val = (BPP_ASIC_3V3 << bpp_tuned18_shift) | BPP_PAD_3V3;  	} else if (voltage == OUTPUT_1V8) {  		err = rtsx_pci_write_register(pcr,  				SD30_DRIVE_SEL, 0x07, pcr->sd30_drive_sel_1v8);  		if (err < 0)  			return err; -		val = (BPP_ASIC_1V8 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_1V8; +		val = (bpp_asic_1v8 << bpp_tuned18_shift) | BPP_PAD_1V8;  	} else {  		return -EINVAL;  	} @@ -216,6 +217,18 @@ static int rtl8411_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage)  	return rtsx_pci_write_register(pcr, LDO_CTL, mask, val);  } +static int rtl8411_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage) +{ +	return rtl8411_do_switch_output_voltage(pcr, voltage, +			BPP_TUNED18_SHIFT_8411, BPP_ASIC_1V8); +} + +static int rtl8402_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage) +{ +	return rtl8411_do_switch_output_voltage(pcr, voltage, +			BPP_TUNED18_SHIFT_8402, BPP_ASIC_2V0); +} +  static unsigned int rtl8411_cd_deglitch(struct rtsx_pcr *pcr)  {  	unsigned int card_exist; @@ -295,6 +308,22 @@ static const struct pcr_ops rtl8411_pcr_ops = {  	.force_power_down = rtl8411_force_power_down,  }; +static const struct pcr_ops rtl8402_pcr_ops = { +	.fetch_vendor_settings = rtl8411_fetch_vendor_settings, +	.extra_init_hw = rtl8411_extra_init_hw, +	.optimize_phy = NULL, +	.turn_on_led = rtl8411_turn_on_led, +	.turn_off_led = rtl8411_turn_off_led, +	.enable_auto_blink = rtl8411_enable_auto_blink, +	.disable_auto_blink = rtl8411_disable_auto_blink, +	.card_power_on = rtl8411_card_power_on, +	.card_power_off = rtl8411_card_power_off, +	.switch_output_voltage = rtl8402_switch_output_voltage, +	.cd_deglitch = rtl8411_cd_deglitch, +	.conv_clk_and_div_n = rtl8411_conv_clk_and_div_n, +	.force_power_down = rtl8411_force_power_down, +}; +  static const struct pcr_ops rtl8411b_pcr_ops = {  	.fetch_vendor_settings = rtl8411b_fetch_vendor_settings,  	.extra_init_hw = rtl8411b_extra_init_hw, @@ -441,12 +470,10 @@ static const u32 rtl8411b_qfn48_ms_pull_ctl_disable_tbl[] = {  	0,  }; -void rtl8411_init_params(struct rtsx_pcr *pcr) +static void rtl8411_init_common_params(struct rtsx_pcr *pcr)  {  	pcr->extra_caps = EXTRA_CAPS_SD_SDR50 | EXTRA_CAPS_SD_SDR104;  	pcr->num_slots = 2; -	pcr->ops = &rtl8411_pcr_ops; -  	pcr->flags = 0;  	pcr->card_drive_sel = RTL8411_CARD_DRIVE_DEFAULT;  	pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B; @@ -454,47 +481,29 @@ void rtl8411_init_params(struct rtsx_pcr *pcr)  	pcr->aspm_en = ASPM_L1_EN;  	pcr->tx_initial_phase = SET_CLOCK_PHASE(23, 7, 14);  	pcr->rx_initial_phase = SET_CLOCK_PHASE(4, 3, 10); -  	pcr->ic_version = rtl8411_get_ic_version(pcr); -	pcr->sd_pull_ctl_enable_tbl = rtl8411_sd_pull_ctl_enable_tbl; -	pcr->sd_pull_ctl_disable_tbl = rtl8411_sd_pull_ctl_disable_tbl; -	pcr->ms_pull_ctl_enable_tbl = rtl8411_ms_pull_ctl_enable_tbl; -	pcr->ms_pull_ctl_disable_tbl = rtl8411_ms_pull_ctl_disable_tbl; +} + +void rtl8411_init_params(struct rtsx_pcr *pcr) +{ +	rtl8411_init_common_params(pcr); +	pcr->ops = &rtl8411_pcr_ops; +	set_pull_ctrl_tables(pcr, rtl8411);  }  void rtl8411b_init_params(struct rtsx_pcr *pcr)  { -	pcr->extra_caps = EXTRA_CAPS_SD_SDR50 | EXTRA_CAPS_SD_SDR104; -	pcr->num_slots = 2; +	rtl8411_init_common_params(pcr);  	pcr->ops = &rtl8411b_pcr_ops; +	if (rtl8411b_is_qfn48(pcr)) +		set_pull_ctrl_tables(pcr, rtl8411b_qfn48); +	else +		set_pull_ctrl_tables(pcr, rtl8411b_qfn64); +} -	pcr->flags = 0; -	pcr->card_drive_sel = RTL8411_CARD_DRIVE_DEFAULT; -	pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B; -	pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D; -	pcr->aspm_en = ASPM_L1_EN; -	pcr->tx_initial_phase = SET_CLOCK_PHASE(23, 7, 14); -	pcr->rx_initial_phase = SET_CLOCK_PHASE(4, 3, 10); - -	pcr->ic_version = rtl8411_get_ic_version(pcr); - -	if (rtl8411b_is_qfn48(pcr)) { -		pcr->sd_pull_ctl_enable_tbl = -			rtl8411b_qfn48_sd_pull_ctl_enable_tbl; -		pcr->sd_pull_ctl_disable_tbl = -			rtl8411b_qfn48_sd_pull_ctl_disable_tbl; -		pcr->ms_pull_ctl_enable_tbl = -			rtl8411b_qfn48_ms_pull_ctl_enable_tbl; -		pcr->ms_pull_ctl_disable_tbl = -			rtl8411b_qfn48_ms_pull_ctl_disable_tbl; -	} else { -		pcr->sd_pull_ctl_enable_tbl = -			rtl8411b_qfn64_sd_pull_ctl_enable_tbl; -		pcr->sd_pull_ctl_disable_tbl = -			rtl8411b_qfn64_sd_pull_ctl_disable_tbl; -		pcr->ms_pull_ctl_enable_tbl = -			rtl8411b_qfn64_ms_pull_ctl_enable_tbl; -		pcr->ms_pull_ctl_disable_tbl = -			rtl8411b_qfn64_ms_pull_ctl_disable_tbl; -	} +void rtl8402_init_params(struct rtsx_pcr *pcr) +{ +	rtl8411_init_common_params(pcr); +	pcr->ops = &rtl8402_pcr_ops; +	set_pull_ctrl_tables(pcr, rtl8411);  }  | 
