• Home
  • Raw
  • Download

Lines Matching +full:ssc +full:- +full:internal

1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* Driver for Realtek PCI-Express card reader
4 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
13 #include <linux/dma-mapping.h>
85 if (pcr->aspm_enabled == enable) in rtsx_comm_set_aspm()
88 if (pcr->aspm_mode == ASPM_MODE_CFG) { in rtsx_comm_set_aspm()
89 pcie_capability_clear_and_set_word(pcr->pci, PCI_EXP_LNKCTL, in rtsx_comm_set_aspm()
91 enable ? pcr->aspm_en : 0); in rtsx_comm_set_aspm()
92 } else if (pcr->aspm_mode == ASPM_MODE_REG) { in rtsx_comm_set_aspm()
93 if (pcr->aspm_en & 0x02) in rtsx_comm_set_aspm()
101 if (!enable && (pcr->aspm_en & 0x02)) in rtsx_comm_set_aspm()
104 pcr->aspm_enabled = enable; in rtsx_comm_set_aspm()
109 if (pcr->ops->set_aspm) in rtsx_disable_aspm()
110 pcr->ops->set_aspm(pcr, false); in rtsx_disable_aspm()
124 if (pcr->ops->set_l1off_cfg_sub_d0) in rtsx_set_l1off_sub_cfg_d0()
125 pcr->ops->set_l1off_cfg_sub_d0(pcr, active); in rtsx_set_l1off_sub_cfg_d0()
130 struct rtsx_cr_option *option = &pcr->option; in rtsx_comm_pm_full_on()
137 if (option->ltr_enabled) in rtsx_comm_pm_full_on()
138 rtsx_set_ltr_latency(pcr, option->ltr_active_latency); in rtsx_comm_pm_full_on()
152 if (pcr->remove_pci) in rtsx_pci_start_run()
155 if (pcr->state != PDEV_STAT_RUN) { in rtsx_pci_start_run()
156 pcr->state = PDEV_STAT_RUN; in rtsx_pci_start_run()
157 if (pcr->ops->enable_auto_blink) in rtsx_pci_start_run()
158 pcr->ops->enable_auto_blink(pcr); in rtsx_pci_start_run()
179 return -EIO; in rtsx_pci_write_register()
184 return -ETIMEDOUT; in rtsx_pci_write_register()
203 return -ETIMEDOUT; in rtsx_pci_read_register()
234 return -ETIMEDOUT; in __rtsx_pci_write_phy_register()
241 if (pcr->ops->write_phy) in rtsx_pci_write_phy_register()
242 return pcr->ops->write_phy(pcr, addr, val); in rtsx_pci_write_phy_register()
269 return -ETIMEDOUT; in __rtsx_pci_read_phy_register()
283 if (pcr->ops->read_phy) in rtsx_pci_read_phy_register()
284 return pcr->ops->read_phy(pcr, addr, val); in rtsx_pci_read_phy_register()
292 if (pcr->ops->stop_cmd) in rtsx_pci_stop_cmd()
293 return pcr->ops->stop_cmd(pcr); in rtsx_pci_stop_cmd()
308 u32 *ptr = (u32 *)(pcr->host_cmds_ptr); in rtsx_pci_add_cmd()
315 spin_lock_irqsave(&pcr->lock, flags); in rtsx_pci_add_cmd()
316 ptr += pcr->ci; in rtsx_pci_add_cmd()
317 if (pcr->ci < (HOST_CMDS_BUF_LEN / 4)) { in rtsx_pci_add_cmd()
320 pcr->ci++; in rtsx_pci_add_cmd()
322 spin_unlock_irqrestore(&pcr->lock, flags); in rtsx_pci_add_cmd()
330 rtsx_pci_writel(pcr, RTSX_HCBAR, pcr->host_cmds_addr); in rtsx_pci_send_cmd_no_wait()
332 val |= (u32)(pcr->ci * 4) & 0x00FFFFFF; in rtsx_pci_send_cmd_no_wait()
347 spin_lock_irqsave(&pcr->lock, flags); in rtsx_pci_send_cmd()
350 pcr->done = &trans_done; in rtsx_pci_send_cmd()
351 pcr->trans_result = TRANS_NOT_READY; in rtsx_pci_send_cmd()
354 rtsx_pci_writel(pcr, RTSX_HCBAR, pcr->host_cmds_addr); in rtsx_pci_send_cmd()
356 val |= (u32)(pcr->ci * 4) & 0x00FFFFFF; in rtsx_pci_send_cmd()
361 spin_unlock_irqrestore(&pcr->lock, flags); in rtsx_pci_send_cmd()
368 err = -ETIMEDOUT; in rtsx_pci_send_cmd()
372 spin_lock_irqsave(&pcr->lock, flags); in rtsx_pci_send_cmd()
373 if (pcr->trans_result == TRANS_RESULT_FAIL) in rtsx_pci_send_cmd()
374 err = -EINVAL; in rtsx_pci_send_cmd()
375 else if (pcr->trans_result == TRANS_RESULT_OK) in rtsx_pci_send_cmd()
377 else if (pcr->trans_result == TRANS_NO_DEVICE) in rtsx_pci_send_cmd()
378 err = -ENODEV; in rtsx_pci_send_cmd()
379 spin_unlock_irqrestore(&pcr->lock, flags); in rtsx_pci_send_cmd()
382 spin_lock_irqsave(&pcr->lock, flags); in rtsx_pci_send_cmd()
383 pcr->done = NULL; in rtsx_pci_send_cmd()
384 spin_unlock_irqrestore(&pcr->lock, flags); in rtsx_pci_send_cmd()
386 if ((err < 0) && (err != -ENODEV)) in rtsx_pci_send_cmd()
389 if (pcr->finish_me) in rtsx_pci_send_cmd()
390 complete(pcr->finish_me); in rtsx_pci_send_cmd()
399 u64 *ptr = (u64 *)(pcr->host_sg_tbl_ptr) + pcr->sgi; in rtsx_pci_add_sg_tbl()
418 pcr->sgi++; in rtsx_pci_add_sg_tbl()
426 pcr_dbg(pcr, "--> %s: num_sg = %d\n", __func__, num_sg); in rtsx_pci_transfer_data()
429 return -EINVAL; in rtsx_pci_transfer_data()
445 if (pcr->remove_pci) in rtsx_pci_dma_map_sg()
446 return -EINVAL; in rtsx_pci_dma_map_sg()
449 return -EINVAL; in rtsx_pci_dma_map_sg()
451 return dma_map_sg(&(pcr->pci->dev), sglist, num_sg, dir); in rtsx_pci_dma_map_sg()
460 dma_unmap_sg(&(pcr->pci->dev), sglist, num_sg, dir); in rtsx_pci_dma_unmap_sg()
477 if (pcr->remove_pci) in rtsx_pci_dma_transfer()
478 return -ENODEV; in rtsx_pci_dma_transfer()
481 return -EINVAL; in rtsx_pci_dma_transfer()
484 pcr->sgi = 0; in rtsx_pci_dma_transfer()
488 rtsx_pci_add_sg_tbl(pcr, addr, len, i == count - 1); in rtsx_pci_dma_transfer()
491 spin_lock_irqsave(&pcr->lock, flags); in rtsx_pci_dma_transfer()
493 pcr->done = &trans_done; in rtsx_pci_dma_transfer()
494 pcr->trans_result = TRANS_NOT_READY; in rtsx_pci_dma_transfer()
496 rtsx_pci_writel(pcr, RTSX_HDBAR, pcr->host_sg_tbl_addr); in rtsx_pci_dma_transfer()
499 spin_unlock_irqrestore(&pcr->lock, flags); in rtsx_pci_dma_transfer()
505 err = -ETIMEDOUT; in rtsx_pci_dma_transfer()
509 spin_lock_irqsave(&pcr->lock, flags); in rtsx_pci_dma_transfer()
510 if (pcr->trans_result == TRANS_RESULT_FAIL) { in rtsx_pci_dma_transfer()
511 err = -EILSEQ; in rtsx_pci_dma_transfer()
512 if (pcr->dma_error_count < RTS_MAX_TIMES_FREQ_REDUCTION) in rtsx_pci_dma_transfer()
513 pcr->dma_error_count++; in rtsx_pci_dma_transfer()
516 else if (pcr->trans_result == TRANS_NO_DEVICE) in rtsx_pci_dma_transfer()
517 err = -ENODEV; in rtsx_pci_dma_transfer()
518 spin_unlock_irqrestore(&pcr->lock, flags); in rtsx_pci_dma_transfer()
521 spin_lock_irqsave(&pcr->lock, flags); in rtsx_pci_dma_transfer()
522 pcr->done = NULL; in rtsx_pci_dma_transfer()
523 spin_unlock_irqrestore(&pcr->lock, flags); in rtsx_pci_dma_transfer()
525 if ((err < 0) && (err != -ENODEV)) in rtsx_pci_dma_transfer()
528 if (pcr->finish_me) in rtsx_pci_dma_transfer()
529 complete(pcr->finish_me); in rtsx_pci_dma_transfer()
640 tbl = pcr->sd_pull_ctl_enable_tbl; in rtsx_pci_card_pull_ctl_enable()
642 tbl = pcr->ms_pull_ctl_enable_tbl; in rtsx_pci_card_pull_ctl_enable()
644 return -EINVAL; in rtsx_pci_card_pull_ctl_enable()
655 tbl = pcr->sd_pull_ctl_disable_tbl; in rtsx_pci_card_pull_ctl_disable()
657 tbl = pcr->ms_pull_ctl_disable_tbl; in rtsx_pci_card_pull_ctl_disable()
659 return -EINVAL; in rtsx_pci_card_pull_ctl_disable()
667 struct rtsx_hw_param *hw_param = &pcr->hw_param; in rtsx_pci_enable_bus_int()
669 pcr->bier = TRANS_OK_INT_EN | TRANS_FAIL_INT_EN | SD_INT_EN in rtsx_pci_enable_bus_int()
670 | hw_param->interrupt_en; in rtsx_pci_enable_bus_int()
672 if (pcr->num_slots > 1) in rtsx_pci_enable_bus_int()
673 pcr->bier |= MS_INT_EN; in rtsx_pci_enable_bus_int()
676 rtsx_pci_writel(pcr, RTSX_BIER, pcr->bier); in rtsx_pci_enable_bus_int()
678 pcr_dbg(pcr, "RTSX_BIER: 0x%08x\n", pcr->bier); in rtsx_pci_enable_bus_int()
683 return ((depth > 1) ? (depth - 1) : depth); in double_ssc_depth()
689 if (ssc_depth > (div - 1)) in revise_ssc_depth()
690 ssc_depth -= (div - 1); in revise_ssc_depth()
732 pcr->dma_error_count && in rtsx_pci_switch_clock()
734 card_clock = UHS_SDR104_MAX_DTR - in rtsx_pci_switch_clock()
735 (pcr->dma_error_count * 20000000); in rtsx_pci_switch_clock()
743 pcr_dbg(pcr, "Internal SSC clock: %dMHz (cur_clock = %d)\n", in rtsx_pci_switch_clock()
744 clk, pcr->cur_clock); in rtsx_pci_switch_clock()
746 if (clk == pcr->cur_clock) in rtsx_pci_switch_clock()
749 if (pcr->ops->conv_clk_and_div_n) in rtsx_pci_switch_clock()
750 n = (u8)pcr->ops->conv_clk_and_div_n(clk, CLK_TO_DIV_N); in rtsx_pci_switch_clock()
752 n = (u8)(clk - 2); in rtsx_pci_switch_clock()
754 return -EINVAL; in rtsx_pci_switch_clock()
760 /* Make sure that the SSC clock div_n is not less than MIN_DIV_N_PCR */ in rtsx_pci_switch_clock()
763 if (pcr->ops->conv_clk_and_div_n) { in rtsx_pci_switch_clock()
764 int dbl_clk = pcr->ops->conv_clk_and_div_n(n, in rtsx_pci_switch_clock()
766 n = (u8)pcr->ops->conv_clk_and_div_n(dbl_clk, in rtsx_pci_switch_clock()
769 n = (n + 2) * 2 - 2; in rtsx_pci_switch_clock()
803 /* Wait SSC clock stable */ in rtsx_pci_switch_clock()
809 pcr->cur_clock = clk; in rtsx_pci_switch_clock()
816 if (pcr->ops->card_power_on) in rtsx_pci_card_power_on()
817 return pcr->ops->card_power_on(pcr, card); in rtsx_pci_card_power_on()
825 if (pcr->ops->card_power_off) in rtsx_pci_card_power_off()
826 return pcr->ops->card_power_off(pcr, card); in rtsx_pci_card_power_off()
839 if (!(pcr->flags & PCR_MS_PMOS)) { in rtsx_pci_card_exclusive_check()
843 if (pcr->card_exist & (~cd_mask[card])) in rtsx_pci_card_exclusive_check()
844 return -EIO; in rtsx_pci_card_exclusive_check()
853 if (pcr->ops->switch_output_voltage) in rtsx_pci_switch_output_voltage()
854 return pcr->ops->switch_output_voltage(pcr, voltage); in rtsx_pci_switch_output_voltage()
865 if (pcr->ops->cd_deglitch) in rtsx_pci_card_exist()
866 val = pcr->ops->cd_deglitch(pcr); in rtsx_pci_card_exist()
876 pcr->finish_me = &finish; in rtsx_pci_complete_unfinished_transfer()
879 if (pcr->done) in rtsx_pci_complete_unfinished_transfer()
880 complete(pcr->done); in rtsx_pci_complete_unfinished_transfer()
882 if (!pcr->remove_pci) in rtsx_pci_complete_unfinished_transfer()
887 pcr->finish_me = NULL; in rtsx_pci_complete_unfinished_transfer()
902 pcr_dbg(pcr, "--> %s\n", __func__); in rtsx_pci_card_detect()
904 mutex_lock(&pcr->pcr_mutex); in rtsx_pci_card_detect()
905 spin_lock_irqsave(&pcr->lock, flags); in rtsx_pci_card_detect()
911 card_inserted = pcr->card_inserted & irq_status; in rtsx_pci_card_detect()
912 card_removed = pcr->card_removed; in rtsx_pci_card_detect()
913 pcr->card_inserted = 0; in rtsx_pci_card_detect()
914 pcr->card_removed = 0; in rtsx_pci_card_detect()
916 spin_unlock_irqrestore(&pcr->lock, flags); in rtsx_pci_card_detect()
922 if (pcr->ops->cd_deglitch) in rtsx_pci_card_detect()
923 card_inserted = pcr->ops->cd_deglitch(pcr); in rtsx_pci_card_detect()
927 pcr->card_exist |= card_inserted; in rtsx_pci_card_detect()
928 pcr->card_exist &= ~card_removed; in rtsx_pci_card_detect()
931 mutex_unlock(&pcr->pcr_mutex); in rtsx_pci_card_detect()
933 if ((card_detect & SD_EXIST) && pcr->slots[RTSX_SD_CARD].card_event) in rtsx_pci_card_detect()
934 pcr->slots[RTSX_SD_CARD].card_event( in rtsx_pci_card_detect()
935 pcr->slots[RTSX_SD_CARD].p_dev); in rtsx_pci_card_detect()
936 if ((card_detect & MS_EXIST) && pcr->slots[RTSX_MS_CARD].card_event) in rtsx_pci_card_detect()
937 pcr->slots[RTSX_MS_CARD].card_event( in rtsx_pci_card_detect()
938 pcr->slots[RTSX_MS_CARD].p_dev); in rtsx_pci_card_detect()
943 if (pcr->ops->process_ocp) { in rtsx_pci_process_ocp()
944 pcr->ops->process_ocp(pcr); in rtsx_pci_process_ocp()
946 if (!pcr->option.ocp_en) in rtsx_pci_process_ocp()
948 rtsx_pci_get_ocpstat(pcr, &pcr->ocp_stat); in rtsx_pci_process_ocp()
949 if (pcr->ocp_stat & (SD_OC_NOW | SD_OC_EVER)) { in rtsx_pci_process_ocp()
953 pcr->ocp_stat = 0; in rtsx_pci_process_ocp()
960 if (pcr->option.ocp_en) in rtsx_pci_process_ocp_interrupt()
974 spin_lock(&pcr->lock); in rtsx_pci_isr()
979 if ((int_reg & pcr->bier) == 0) { in rtsx_pci_isr()
980 spin_unlock(&pcr->lock); in rtsx_pci_isr()
984 spin_unlock(&pcr->lock); in rtsx_pci_isr()
988 int_reg &= (pcr->bier | 0x7FFFFF); in rtsx_pci_isr()
995 pcr->card_inserted |= SD_EXIST; in rtsx_pci_isr()
997 pcr->card_removed |= SD_EXIST; in rtsx_pci_isr()
998 pcr->card_inserted &= ~SD_EXIST; in rtsx_pci_isr()
1002 pcr->extra_caps |= EXTRA_CAPS_SD_EXPRESS; in rtsx_pci_isr()
1005 pcr->dma_error_count = 0; in rtsx_pci_isr()
1010 pcr->card_inserted |= MS_EXIST; in rtsx_pci_isr()
1012 pcr->card_removed |= MS_EXIST; in rtsx_pci_isr()
1013 pcr->card_inserted &= ~MS_EXIST; in rtsx_pci_isr()
1019 pcr->trans_result = TRANS_RESULT_FAIL; in rtsx_pci_isr()
1020 if (pcr->done) in rtsx_pci_isr()
1021 complete(pcr->done); in rtsx_pci_isr()
1023 pcr->trans_result = TRANS_RESULT_OK; in rtsx_pci_isr()
1024 if (pcr->done) in rtsx_pci_isr()
1025 complete(pcr->done); in rtsx_pci_isr()
1029 if ((pcr->card_inserted || pcr->card_removed) && !(int_reg & SD_OC_INT)) in rtsx_pci_isr()
1030 schedule_delayed_work(&pcr->carddet_work, in rtsx_pci_isr()
1033 spin_unlock(&pcr->lock); in rtsx_pci_isr()
1039 pcr_dbg(pcr, "%s: pcr->msi_en = %d, pci->irq = %d\n", in rtsx_pci_acquire_irq()
1040 __func__, pcr->msi_en, pcr->pci->irq); in rtsx_pci_acquire_irq()
1042 if (request_irq(pcr->pci->irq, rtsx_pci_isr, in rtsx_pci_acquire_irq()
1043 pcr->msi_en ? 0 : IRQF_SHARED, in rtsx_pci_acquire_irq()
1045 dev_err(&(pcr->pci->dev), in rtsx_pci_acquire_irq()
1047 pcr->pci->irq); in rtsx_pci_acquire_irq()
1048 return -1; in rtsx_pci_acquire_irq()
1051 pcr->irq = pcr->pci->irq; in rtsx_pci_acquire_irq()
1052 pci_intx(pcr->pci, !pcr->msi_en); in rtsx_pci_acquire_irq()
1065 rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, in rtsx_base_force_power_down()
1073 if (pcr->ops->turn_off_led) in rtsx_pci_power_off()
1074 pcr->ops->turn_off_led(pcr); in rtsx_pci_power_off()
1077 pcr->bier = 0; in rtsx_pci_power_off()
1082 if (pcr->ops->force_power_down) in rtsx_pci_power_off()
1083 pcr->ops->force_power_down(pcr, pm_state, runtime); in rtsx_pci_power_off()
1092 if (pcr->ops->enable_ocp) { in rtsx_pci_enable_ocp()
1093 pcr->ops->enable_ocp(pcr); in rtsx_pci_enable_ocp()
1105 if (pcr->ops->disable_ocp) { in rtsx_pci_disable_ocp()
1106 pcr->ops->disable_ocp(pcr); in rtsx_pci_disable_ocp()
1116 if (pcr->ops->init_ocp) { in rtsx_pci_init_ocp()
1117 pcr->ops->init_ocp(pcr); in rtsx_pci_init_ocp()
1119 struct rtsx_cr_option *option = &(pcr->option); in rtsx_pci_init_ocp()
1121 if (option->ocp_en) { in rtsx_pci_init_ocp()
1122 u8 val = option->sd_800mA_ocp_thd; in rtsx_pci_init_ocp()
1130 SD_OCP_GLITCH_MASK, pcr->hw_param.ocp_glitch); in rtsx_pci_init_ocp()
1138 if (pcr->ops->get_ocpstat) in rtsx_pci_get_ocpstat()
1139 return pcr->ops->get_ocpstat(pcr, val); in rtsx_pci_get_ocpstat()
1146 if (pcr->ops->clear_ocpstat) { in rtsx_pci_clear_ocpstat()
1147 pcr->ops->clear_ocpstat(pcr); in rtsx_pci_clear_ocpstat()
1217 struct pci_dev *pdev = pcr->pci; in rtsx_pci_init_hw()
1224 rtsx_pci_writel(pcr, RTSX_HCBAR, pcr->host_cmds_addr); in rtsx_pci_init_hw()
1228 /* Power on SSC */ in rtsx_pci_init_hw()
1241 /* Wait SSC power stable */ in rtsx_pci_init_hw()
1245 if (pcr->ops->optimize_phy) { in rtsx_pci_init_hw()
1246 err = pcr->ops->optimize_phy(pcr); in rtsx_pci_init_hw()
1263 0xFF, pcr->card_drive_sel); in rtsx_pci_init_hw()
1264 /* Enable SSC Clock */ in rtsx_pci_init_hw()
1318 pcie_capability_clear_and_set_word(pcr->pci, PCI_EXP_LNKCTL, in rtsx_pci_init_hw()
1323 if (pcr->ops->extra_init_hw) { in rtsx_pci_init_hw()
1324 err = pcr->ops->extra_init_hw(pcr); in rtsx_pci_init_hw()
1329 if (pcr->aspm_mode == ASPM_MODE_REG) in rtsx_pci_init_hw()
1333 * So we need to initialize pcr->card_exist here. in rtsx_pci_init_hw()
1335 if (pcr->ops->cd_deglitch) in rtsx_pci_init_hw()
1336 pcr->card_exist = pcr->ops->cd_deglitch(pcr); in rtsx_pci_init_hw()
1338 pcr->card_exist = rtsx_pci_readl(pcr, RTSX_BIPR) & CARD_EXIST; in rtsx_pci_init_hw()
1345 struct rtsx_cr_option *option = &(pcr->option); in rtsx_pci_init_chip()
1351 spin_lock_init(&pcr->lock); in rtsx_pci_init_chip()
1352 mutex_init(&pcr->pcr_mutex); in rtsx_pci_init_chip()
1410 PCI_PID(pcr), pcr->ic_version); in rtsx_pci_init_chip()
1412 pcr->slots = kcalloc(pcr->num_slots, sizeof(struct rtsx_slot), in rtsx_pci_init_chip()
1414 if (!pcr->slots) in rtsx_pci_init_chip()
1415 return -ENOMEM; in rtsx_pci_init_chip()
1417 if (pcr->aspm_mode == ASPM_MODE_CFG) { in rtsx_pci_init_chip()
1418 pcie_capability_read_word(pcr->pci, PCI_EXP_LNKCTL, &cfg_val); in rtsx_pci_init_chip()
1420 pcr->aspm_enabled = true; in rtsx_pci_init_chip()
1422 pcr->aspm_enabled = false; in rtsx_pci_init_chip()
1424 } else if (pcr->aspm_mode == ASPM_MODE_REG) { in rtsx_pci_init_chip()
1427 pcr->aspm_enabled = false; in rtsx_pci_init_chip()
1429 pcr->aspm_enabled = true; in rtsx_pci_init_chip()
1432 l1ss = pci_find_ext_capability(pcr->pci, PCI_EXT_CAP_ID_L1SS); in rtsx_pci_init_chip()
1434 pci_read_config_dword(pcr->pci, l1ss + PCI_L1SS_CTL1, &lval); in rtsx_pci_init_chip()
1456 pcie_capability_read_word(pcr->pci, PCI_EXP_DEVCTL2, &cfg_val); in rtsx_pci_init_chip()
1458 option->ltr_enabled = true; in rtsx_pci_init_chip()
1459 option->ltr_active = true; in rtsx_pci_init_chip()
1461 option->ltr_enabled = false; in rtsx_pci_init_chip()
1466 option->force_clkreq_0 = false; in rtsx_pci_init_chip()
1468 option->force_clkreq_0 = true; in rtsx_pci_init_chip()
1470 option->ltr_enabled = false; in rtsx_pci_init_chip()
1471 option->force_clkreq_0 = true; in rtsx_pci_init_chip()
1474 if (pcr->ops->fetch_vendor_settings) in rtsx_pci_init_chip()
1475 pcr->ops->fetch_vendor_settings(pcr); in rtsx_pci_init_chip()
1477 pcr_dbg(pcr, "pcr->aspm_en = 0x%x\n", pcr->aspm_en); in rtsx_pci_init_chip()
1478 pcr_dbg(pcr, "pcr->sd30_drive_sel_1v8 = 0x%x\n", in rtsx_pci_init_chip()
1479 pcr->sd30_drive_sel_1v8); in rtsx_pci_init_chip()
1480 pcr_dbg(pcr, "pcr->sd30_drive_sel_3v3 = 0x%x\n", in rtsx_pci_init_chip()
1481 pcr->sd30_drive_sel_3v3); in rtsx_pci_init_chip()
1482 pcr_dbg(pcr, "pcr->card_drive_sel = 0x%x\n", in rtsx_pci_init_chip()
1483 pcr->card_drive_sel); in rtsx_pci_init_chip()
1484 pcr_dbg(pcr, "pcr->flags = 0x%x\n", pcr->flags); in rtsx_pci_init_chip()
1486 pcr->state = PDEV_STAT_IDLE; in rtsx_pci_init_chip()
1489 kfree(pcr->slots); in rtsx_pci_init_chip()
1504 dev_dbg(&(pcidev->dev), in rtsx_pci_probe()
1505 ": Realtek PCI-E Card Reader found at %s [%04x:%04x] (rev %x)\n", in rtsx_pci_probe()
1506 pci_name(pcidev), (int)pcidev->vendor, (int)pcidev->device, in rtsx_pci_probe()
1507 (int)pcidev->revision); in rtsx_pci_probe()
1509 ret = dma_set_mask(&pcidev->dev, DMA_BIT_MASK(32)); in rtsx_pci_probe()
1523 ret = -ENOMEM; in rtsx_pci_probe()
1529 ret = -ENOMEM; in rtsx_pci_probe()
1532 handle->pcr = pcr; in rtsx_pci_probe()
1538 pcr->id = ret; in rtsx_pci_probe()
1544 pcr->pci = pcidev; in rtsx_pci_probe()
1545 dev_set_drvdata(&pcidev->dev, handle); in rtsx_pci_probe()
1551 pcr->remap_addr = ioremap(base, len); in rtsx_pci_probe()
1552 if (!pcr->remap_addr) { in rtsx_pci_probe()
1553 ret = -ENOMEM; in rtsx_pci_probe()
1557 pcr->rtsx_resv_buf = dma_alloc_coherent(&(pcidev->dev), in rtsx_pci_probe()
1558 RTSX_RESV_BUF_LEN, &(pcr->rtsx_resv_buf_addr), in rtsx_pci_probe()
1560 if (pcr->rtsx_resv_buf == NULL) { in rtsx_pci_probe()
1561 ret = -ENXIO; in rtsx_pci_probe()
1564 pcr->host_cmds_ptr = pcr->rtsx_resv_buf; in rtsx_pci_probe()
1565 pcr->host_cmds_addr = pcr->rtsx_resv_buf_addr; in rtsx_pci_probe()
1566 pcr->host_sg_tbl_ptr = pcr->rtsx_resv_buf + HOST_CMDS_BUF_LEN; in rtsx_pci_probe()
1567 pcr->host_sg_tbl_addr = pcr->rtsx_resv_buf_addr + HOST_CMDS_BUF_LEN; in rtsx_pci_probe()
1568 pcr->card_inserted = 0; in rtsx_pci_probe()
1569 pcr->card_removed = 0; in rtsx_pci_probe()
1570 INIT_DELAYED_WORK(&pcr->carddet_work, rtsx_pci_card_detect); in rtsx_pci_probe()
1572 pcr->msi_en = msi_en; in rtsx_pci_probe()
1573 if (pcr->msi_en) { in rtsx_pci_probe()
1576 pcr->msi_en = false; in rtsx_pci_probe()
1584 synchronize_irq(pcr->irq); in rtsx_pci_probe()
1596 ret = mfd_add_devices(&pcidev->dev, pcr->id, rtsx_pcr_cells, in rtsx_pci_probe()
1601 pm_runtime_allow(&pcidev->dev); in rtsx_pci_probe()
1602 pm_runtime_put(&pcidev->dev); in rtsx_pci_probe()
1607 kfree(pcr->slots); in rtsx_pci_probe()
1609 free_irq(pcr->irq, (void *)pcr); in rtsx_pci_probe()
1611 if (pcr->msi_en) in rtsx_pci_probe()
1612 pci_disable_msi(pcr->pci); in rtsx_pci_probe()
1613 dma_free_coherent(&(pcr->pci->dev), RTSX_RESV_BUF_LEN, in rtsx_pci_probe()
1614 pcr->rtsx_resv_buf, pcr->rtsx_resv_buf_addr); in rtsx_pci_probe()
1616 iounmap(pcr->remap_addr); in rtsx_pci_probe()
1619 idr_remove(&rtsx_pci_idr, pcr->id); in rtsx_pci_probe()
1636 struct rtsx_pcr *pcr = handle->pcr; in rtsx_pci_remove()
1638 pcr->remove_pci = true; in rtsx_pci_remove()
1640 pm_runtime_get_sync(&pcidev->dev); in rtsx_pci_remove()
1641 pm_runtime_forbid(&pcidev->dev); in rtsx_pci_remove()
1644 spin_lock_irq(&pcr->lock); in rtsx_pci_remove()
1646 pcr->bier = 0; in rtsx_pci_remove()
1647 spin_unlock_irq(&pcr->lock); in rtsx_pci_remove()
1649 cancel_delayed_work_sync(&pcr->carddet_work); in rtsx_pci_remove()
1651 mfd_remove_devices(&pcidev->dev); in rtsx_pci_remove()
1653 dma_free_coherent(&(pcr->pci->dev), RTSX_RESV_BUF_LEN, in rtsx_pci_remove()
1654 pcr->rtsx_resv_buf, pcr->rtsx_resv_buf_addr); in rtsx_pci_remove()
1655 free_irq(pcr->irq, (void *)pcr); in rtsx_pci_remove()
1656 if (pcr->msi_en) in rtsx_pci_remove()
1657 pci_disable_msi(pcr->pci); in rtsx_pci_remove()
1658 iounmap(pcr->remap_addr); in rtsx_pci_remove()
1664 idr_remove(&rtsx_pci_idr, pcr->id); in rtsx_pci_remove()
1667 kfree(pcr->slots); in rtsx_pci_remove()
1671 dev_dbg(&(pcidev->dev), in rtsx_pci_remove()
1672 ": Realtek PCI-E Card Reader at %s [%04x:%04x] has been removed\n", in rtsx_pci_remove()
1673 pci_name(pcidev), (int)pcidev->vendor, (int)pcidev->device); in rtsx_pci_remove()
1680 struct rtsx_pcr *pcr = handle->pcr; in rtsx_pci_suspend()
1682 dev_dbg(&(pcidev->dev), "--> %s\n", __func__); in rtsx_pci_suspend()
1684 cancel_delayed_work_sync(&pcr->carddet_work); in rtsx_pci_suspend()
1686 mutex_lock(&pcr->pcr_mutex); in rtsx_pci_suspend()
1690 mutex_unlock(&pcr->pcr_mutex); in rtsx_pci_suspend()
1698 struct rtsx_pcr *pcr = handle->pcr; in rtsx_pci_resume()
1701 dev_dbg(&(pcidev->dev), "--> %s\n", __func__); in rtsx_pci_resume()
1703 mutex_lock(&pcr->pcr_mutex); in rtsx_pci_resume()
1714 mutex_unlock(&pcr->pcr_mutex); in rtsx_pci_resume()
1722 if (pcr->ops->set_aspm) in rtsx_enable_aspm()
1723 pcr->ops->set_aspm(pcr, true); in rtsx_enable_aspm()
1730 struct rtsx_cr_option *option = &pcr->option; in rtsx_comm_pm_power_saving()
1732 if (option->ltr_enabled) { in rtsx_comm_pm_power_saving()
1733 u32 latency = option->ltr_l1off_latency; in rtsx_comm_pm_power_saving()
1736 mdelay(option->l1_snooze_delay); in rtsx_comm_pm_power_saving()
1755 struct rtsx_pcr *pcr = handle->pcr; in rtsx_pci_shutdown()
1757 dev_dbg(&(pcidev->dev), "--> %s\n", __func__); in rtsx_pci_shutdown()
1762 free_irq(pcr->irq, (void *)pcr); in rtsx_pci_shutdown()
1763 if (pcr->msi_en) in rtsx_pci_shutdown()
1764 pci_disable_msi(pcr->pci); in rtsx_pci_shutdown()
1771 struct rtsx_pcr *pcr = handle->pcr; in rtsx_pci_runtime_idle()
1773 dev_dbg(device, "--> %s\n", __func__); in rtsx_pci_runtime_idle()
1775 mutex_lock(&pcr->pcr_mutex); in rtsx_pci_runtime_idle()
1777 pcr->state = PDEV_STAT_IDLE; in rtsx_pci_runtime_idle()
1779 if (pcr->ops->disable_auto_blink) in rtsx_pci_runtime_idle()
1780 pcr->ops->disable_auto_blink(pcr); in rtsx_pci_runtime_idle()
1781 if (pcr->ops->turn_off_led) in rtsx_pci_runtime_idle()
1782 pcr->ops->turn_off_led(pcr); in rtsx_pci_runtime_idle()
1786 mutex_unlock(&pcr->pcr_mutex); in rtsx_pci_runtime_idle()
1788 if (pcr->rtd3_en) in rtsx_pci_runtime_idle()
1791 return -EBUSY; in rtsx_pci_runtime_idle()
1798 struct rtsx_pcr *pcr = handle->pcr; in rtsx_pci_runtime_suspend()
1800 dev_dbg(device, "--> %s\n", __func__); in rtsx_pci_runtime_suspend()
1802 cancel_delayed_work_sync(&pcr->carddet_work); in rtsx_pci_runtime_suspend()
1804 mutex_lock(&pcr->pcr_mutex); in rtsx_pci_runtime_suspend()
1807 mutex_unlock(&pcr->pcr_mutex); in rtsx_pci_runtime_suspend()
1816 struct rtsx_pcr *pcr = handle->pcr; in rtsx_pci_runtime_resume()
1818 dev_dbg(device, "--> %s\n", __func__); in rtsx_pci_runtime_resume()
1820 mutex_lock(&pcr->pcr_mutex); in rtsx_pci_runtime_resume()
1826 if (pcr->slots[RTSX_SD_CARD].p_dev != NULL) { in rtsx_pci_runtime_resume()
1827 pcr->slots[RTSX_SD_CARD].card_event( in rtsx_pci_runtime_resume()
1828 pcr->slots[RTSX_SD_CARD].p_dev); in rtsx_pci_runtime_resume()
1831 mutex_unlock(&pcr->pcr_mutex); in rtsx_pci_runtime_resume()
1860 MODULE_DESCRIPTION("Realtek PCI-E Card Reader Driver");