Lines Matching refs:hba

59 static bool ufs_mtk_is_boost_crypt_enabled(struct ufs_hba *hba)  in ufs_mtk_is_boost_crypt_enabled()  argument
61 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_is_boost_crypt_enabled()
66 static bool ufs_mtk_is_va09_supported(struct ufs_hba *hba) in ufs_mtk_is_va09_supported() argument
68 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_is_va09_supported()
73 static bool ufs_mtk_is_broken_vcc(struct ufs_hba *hba) in ufs_mtk_is_broken_vcc() argument
75 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_is_broken_vcc()
80 static void ufs_mtk_cfg_unipro_cg(struct ufs_hba *hba, bool enable) in ufs_mtk_cfg_unipro_cg() argument
85 ufshcd_dme_get(hba, in ufs_mtk_cfg_unipro_cg()
91 ufshcd_dme_set(hba, in ufs_mtk_cfg_unipro_cg()
94 ufshcd_dme_get(hba, in ufs_mtk_cfg_unipro_cg()
97 ufshcd_dme_set(hba, in ufs_mtk_cfg_unipro_cg()
100 ufshcd_dme_get(hba, in ufs_mtk_cfg_unipro_cg()
105 ufshcd_dme_set(hba, in ufs_mtk_cfg_unipro_cg()
108 ufshcd_dme_get(hba, in ufs_mtk_cfg_unipro_cg()
111 ufshcd_dme_set(hba, in ufs_mtk_cfg_unipro_cg()
116 static void ufs_mtk_crypto_enable(struct ufs_hba *hba) in ufs_mtk_crypto_enable() argument
122 dev_info(hba->dev, "%s: crypto enable failed, err: %lu\n", in ufs_mtk_crypto_enable()
124 hba->caps &= ~UFSHCD_CAP_CRYPTO; in ufs_mtk_crypto_enable()
128 static void ufs_mtk_host_reset(struct ufs_hba *hba) in ufs_mtk_host_reset() argument
130 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_host_reset()
143 static void ufs_mtk_init_reset_control(struct ufs_hba *hba, in ufs_mtk_init_reset_control() argument
147 *rc = devm_reset_control_get(hba->dev, str); in ufs_mtk_init_reset_control()
149 dev_info(hba->dev, "Failed to get reset control %s: %ld\n", in ufs_mtk_init_reset_control()
155 static void ufs_mtk_init_reset(struct ufs_hba *hba) in ufs_mtk_init_reset() argument
157 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_init_reset()
159 ufs_mtk_init_reset_control(hba, &host->hci_reset, in ufs_mtk_init_reset()
161 ufs_mtk_init_reset_control(hba, &host->unipro_reset, in ufs_mtk_init_reset()
163 ufs_mtk_init_reset_control(hba, &host->crypto_reset, in ufs_mtk_init_reset()
167 static int ufs_mtk_hce_enable_notify(struct ufs_hba *hba, in ufs_mtk_hce_enable_notify() argument
170 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_hce_enable_notify()
175 hba->vps->hba_enable_delay_us = 0; in ufs_mtk_hce_enable_notify()
177 hba->vps->hba_enable_delay_us = 600; in ufs_mtk_hce_enable_notify()
178 ufs_mtk_host_reset(hba); in ufs_mtk_hce_enable_notify()
181 if (hba->caps & UFSHCD_CAP_CRYPTO) in ufs_mtk_hce_enable_notify()
182 ufs_mtk_crypto_enable(hba); in ufs_mtk_hce_enable_notify()
185 spin_lock_irqsave(hba->host->host_lock, flags); in ufs_mtk_hce_enable_notify()
186 ufshcd_writel(hba, 0, in ufs_mtk_hce_enable_notify()
188 spin_unlock_irqrestore(hba->host->host_lock, in ufs_mtk_hce_enable_notify()
191 hba->capabilities &= ~MASK_AUTO_HIBERN8_SUPPORT; in ufs_mtk_hce_enable_notify()
192 hba->ahit = 0; in ufs_mtk_hce_enable_notify()
199 static int ufs_mtk_bind_mphy(struct ufs_hba *hba) in ufs_mtk_bind_mphy() argument
201 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_bind_mphy()
202 struct device *dev = hba->dev; in ufs_mtk_bind_mphy()
237 static int ufs_mtk_setup_ref_clk(struct ufs_hba *hba, bool on) in ufs_mtk_setup_ref_clk() argument
239 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_setup_ref_clk()
250 ufshcd_writel(hba, REFCLK_REQUEST, REG_UFS_REFCLK_CTRL); in ufs_mtk_setup_ref_clk()
252 ufshcd_writel(hba, REFCLK_RELEASE, REG_UFS_REFCLK_CTRL); in ufs_mtk_setup_ref_clk()
259 value = ufshcd_readl(hba, REG_UFS_REFCLK_CTRL); in ufs_mtk_setup_ref_clk()
268 dev_err(hba->dev, "missing ack of refclk req, reg: 0x%x\n", value); in ufs_mtk_setup_ref_clk()
284 static void ufs_mtk_setup_ref_clk_wait_us(struct ufs_hba *hba, in ufs_mtk_setup_ref_clk_wait_us() argument
287 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_setup_ref_clk_wait_us()
289 if (hba->dev_info.clk_gating_wait_us) { in ufs_mtk_setup_ref_clk_wait_us()
291 hba->dev_info.clk_gating_wait_us; in ufs_mtk_setup_ref_clk_wait_us()
299 static int ufs_mtk_wait_link_state(struct ufs_hba *hba, u32 state, in ufs_mtk_wait_link_state() argument
308 ufshcd_writel(hba, 0x20, REG_UFS_DEBUG_SEL); in ufs_mtk_wait_link_state()
309 val = ufshcd_readl(hba, REG_UFS_PROBE); in ufs_mtk_wait_link_state()
325 static int ufs_mtk_mphy_power_on(struct ufs_hba *hba, bool on) in ufs_mtk_mphy_power_on() argument
327 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_mphy_power_on()
336 if (ufs_mtk_is_va09_supported(hba)) { in ufs_mtk_mphy_power_on()
347 if (ufs_mtk_is_va09_supported(hba)) { in ufs_mtk_mphy_power_on()
356 dev_info(hba->dev, in ufs_mtk_mphy_power_on()
382 static void ufs_mtk_boost_crypt(struct ufs_hba *hba, bool boost) in ufs_mtk_boost_crypt() argument
384 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_boost_crypt()
389 if (!ufs_mtk_is_boost_crypt_enabled(hba)) in ufs_mtk_boost_crypt()
398 dev_info(hba->dev, "clk_prepare_enable(): %d\n", in ufs_mtk_boost_crypt()
406 dev_info(hba->dev, in ufs_mtk_boost_crypt()
414 dev_info(hba->dev, in ufs_mtk_boost_crypt()
423 dev_info(hba->dev, in ufs_mtk_boost_crypt()
430 dev_info(hba->dev, in ufs_mtk_boost_crypt()
438 static int ufs_mtk_init_host_clk(struct ufs_hba *hba, const char *name, in ufs_mtk_init_host_clk() argument
443 ret = ufs_mtk_get_host_clk(hba->dev, name, clk); in ufs_mtk_init_host_clk()
445 dev_info(hba->dev, "%s: failed to get %s: %d", __func__, in ufs_mtk_init_host_clk()
452 static void ufs_mtk_init_boost_crypt(struct ufs_hba *hba) in ufs_mtk_init_boost_crypt() argument
454 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_init_boost_crypt()
456 struct device *dev = hba->dev; in ufs_mtk_init_boost_crypt()
479 if (ufs_mtk_init_host_clk(hba, "crypt_mux", in ufs_mtk_init_boost_crypt()
483 if (ufs_mtk_init_host_clk(hba, "crypt_lp", in ufs_mtk_init_boost_crypt()
487 if (ufs_mtk_init_host_clk(hba, "crypt_perf", in ufs_mtk_init_boost_crypt()
499 static void ufs_mtk_init_va09_pwr_ctrl(struct ufs_hba *hba) in ufs_mtk_init_va09_pwr_ctrl() argument
501 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_init_va09_pwr_ctrl()
503 host->reg_va09 = regulator_get(hba->dev, "va09"); in ufs_mtk_init_va09_pwr_ctrl()
505 dev_info(hba->dev, "failed to get va09"); in ufs_mtk_init_va09_pwr_ctrl()
510 static void ufs_mtk_init_host_caps(struct ufs_hba *hba) in ufs_mtk_init_host_caps() argument
512 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_init_host_caps()
513 struct device_node *np = hba->dev->of_node; in ufs_mtk_init_host_caps()
516 ufs_mtk_init_boost_crypt(hba); in ufs_mtk_init_host_caps()
519 ufs_mtk_init_va09_pwr_ctrl(hba); in ufs_mtk_init_host_caps()
527 dev_info(hba->dev, "caps: 0x%x", host->caps); in ufs_mtk_init_host_caps()
538 static int ufs_mtk_setup_clocks(struct ufs_hba *hba, bool on, in ufs_mtk_setup_clocks() argument
541 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_setup_clocks()
554 if (ufshcd_is_link_off(hba)) { in ufs_mtk_setup_clocks()
556 } else if (ufshcd_is_link_hibern8(hba) || in ufs_mtk_setup_clocks()
557 (!ufshcd_can_hibern8_during_gating(hba) && in ufs_mtk_setup_clocks()
558 ufshcd_is_auto_hibern8_enabled(hba))) { in ufs_mtk_setup_clocks()
564 ret = ufs_mtk_wait_link_state(hba, in ufs_mtk_setup_clocks()
572 ufs_mtk_boost_crypt(hba, on); in ufs_mtk_setup_clocks()
573 ufs_mtk_setup_ref_clk(hba, on); in ufs_mtk_setup_clocks()
578 ufs_mtk_setup_ref_clk(hba, on); in ufs_mtk_setup_clocks()
579 ufs_mtk_boost_crypt(hba, on); in ufs_mtk_setup_clocks()
585 static void ufs_mtk_get_controller_version(struct ufs_hba *hba) in ufs_mtk_get_controller_version() argument
587 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_get_controller_version()
596 ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_LOCALVERINFO), &ver); in ufs_mtk_get_controller_version()
604 if (hba->ufs_version < ufshci_version(3, 0)) in ufs_mtk_get_controller_version()
605 hba->ufs_version = ufshci_version(3, 0); in ufs_mtk_get_controller_version()
610 static u32 ufs_mtk_get_ufs_hci_version(struct ufs_hba *hba) in ufs_mtk_get_ufs_hci_version() argument
612 return hba->ufs_version; in ufs_mtk_get_ufs_hci_version()
625 static int ufs_mtk_init(struct ufs_hba *hba) in ufs_mtk_init() argument
628 struct device *dev = hba->dev; in ufs_mtk_init()
639 host->hba = hba; in ufs_mtk_init()
640 ufshcd_set_variant(hba, host); in ufs_mtk_init()
649 ufs_mtk_init_host_caps(hba); in ufs_mtk_init()
651 err = ufs_mtk_bind_mphy(hba); in ufs_mtk_init()
655 ufs_mtk_init_reset(hba); in ufs_mtk_init()
658 hba->caps |= UFSHCD_CAP_RPM_AUTOSUSPEND; in ufs_mtk_init()
661 hba->caps |= UFSHCD_CAP_CLK_GATING; in ufs_mtk_init()
664 hba->caps |= UFSHCD_CAP_CRYPTO; in ufs_mtk_init()
667 hba->caps |= UFSHCD_CAP_WB_EN; in ufs_mtk_init()
668 hba->quirks |= UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL; in ufs_mtk_init()
669 hba->vps->wb_flush_threshold = UFS_WB_BUF_REMAIN_PERCENT(80); in ufs_mtk_init()
672 hba->caps |= UFSHCD_CAP_HIBERN8_WITH_CLK_GATING; in ufs_mtk_init()
681 ufs_mtk_mphy_power_on(hba, true); in ufs_mtk_init()
682 ufs_mtk_setup_clocks(hba, true, POST_CHANGE); in ufs_mtk_init()
687 ufshcd_set_variant(hba, NULL); in ufs_mtk_init()
692 static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba, in ufs_mtk_pre_pwr_change() argument
696 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_pre_pwr_change()
728 ufshcd_dme_set(hba, in ufs_mtk_pre_pwr_change()
736 static int ufs_mtk_pwr_change_notify(struct ufs_hba *hba, in ufs_mtk_pwr_change_notify() argument
745 ret = ufs_mtk_pre_pwr_change(hba, dev_max_params, in ufs_mtk_pwr_change_notify()
758 static int ufs_mtk_unipro_set_pm(struct ufs_hba *hba, bool lpm) in ufs_mtk_unipro_set_pm() argument
761 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_unipro_set_pm()
763 ret = ufshcd_dme_set(hba, in ufs_mtk_unipro_set_pm()
778 static int ufs_mtk_pre_link(struct ufs_hba *hba) in ufs_mtk_pre_link() argument
783 ufs_mtk_get_controller_version(hba); in ufs_mtk_pre_link()
785 ret = ufs_mtk_unipro_set_pm(hba, false); in ufs_mtk_pre_link()
794 ret = ufshcd_disable_host_tx_lcc(hba); in ufs_mtk_pre_link()
799 ret = ufshcd_dme_get(hba, UIC_ARG_MIB(VS_SAVEPOWERCONTROL), &tmp); in ufs_mtk_pre_link()
805 ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_SAVEPOWERCONTROL), tmp); in ufs_mtk_pre_link()
810 static void ufs_mtk_setup_clk_gating(struct ufs_hba *hba) in ufs_mtk_setup_clk_gating() argument
815 if (ufshcd_is_clkgating_allowed(hba)) { in ufs_mtk_setup_clk_gating()
816 if (ufshcd_is_auto_hibern8_supported(hba) && hba->ahit) in ufs_mtk_setup_clk_gating()
818 hba->ahit); in ufs_mtk_setup_clk_gating()
821 spin_lock_irqsave(hba->host->host_lock, flags); in ufs_mtk_setup_clk_gating()
822 hba->clk_gating.delay_ms = ah_ms + 5; in ufs_mtk_setup_clk_gating()
823 spin_unlock_irqrestore(hba->host->host_lock, flags); in ufs_mtk_setup_clk_gating()
827 static int ufs_mtk_post_link(struct ufs_hba *hba) in ufs_mtk_post_link() argument
830 ufs_mtk_cfg_unipro_cg(hba, true); in ufs_mtk_post_link()
833 if (ufshcd_is_auto_hibern8_supported(hba)) { in ufs_mtk_post_link()
834 ufshcd_auto_hibern8_update(hba, in ufs_mtk_post_link()
839 ufs_mtk_setup_clk_gating(hba); in ufs_mtk_post_link()
844 static int ufs_mtk_link_startup_notify(struct ufs_hba *hba, in ufs_mtk_link_startup_notify() argument
851 ret = ufs_mtk_pre_link(hba); in ufs_mtk_link_startup_notify()
854 ret = ufs_mtk_post_link(hba); in ufs_mtk_link_startup_notify()
864 static int ufs_mtk_device_reset(struct ufs_hba *hba) in ufs_mtk_device_reset() argument
869 ufshcd_hba_stop(hba); in ufs_mtk_device_reset()
887 dev_info(hba->dev, "device reset done\n"); in ufs_mtk_device_reset()
892 static int ufs_mtk_link_set_hpm(struct ufs_hba *hba) in ufs_mtk_link_set_hpm() argument
896 err = ufshcd_hba_enable(hba); in ufs_mtk_link_set_hpm()
900 err = ufs_mtk_unipro_set_pm(hba, false); in ufs_mtk_link_set_hpm()
904 err = ufshcd_uic_hibern8_exit(hba); in ufs_mtk_link_set_hpm()
906 ufshcd_set_link_active(hba); in ufs_mtk_link_set_hpm()
910 err = ufshcd_make_hba_operational(hba); in ufs_mtk_link_set_hpm()
917 static int ufs_mtk_link_set_lpm(struct ufs_hba *hba) in ufs_mtk_link_set_lpm() argument
921 err = ufs_mtk_unipro_set_pm(hba, true); in ufs_mtk_link_set_lpm()
924 ufs_mtk_unipro_set_pm(hba, false); in ufs_mtk_link_set_lpm()
931 static void ufs_mtk_vreg_set_lpm(struct ufs_hba *hba, bool lpm) in ufs_mtk_vreg_set_lpm() argument
933 if (!hba->vreg_info.vccq2 || !hba->vreg_info.vcc) in ufs_mtk_vreg_set_lpm()
936 if (lpm && !hba->vreg_info.vcc->enabled) in ufs_mtk_vreg_set_lpm()
937 regulator_set_mode(hba->vreg_info.vccq2->reg, in ufs_mtk_vreg_set_lpm()
940 regulator_set_mode(hba->vreg_info.vccq2->reg, in ufs_mtk_vreg_set_lpm()
944 static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) in ufs_mtk_suspend() argument
949 if (ufshcd_is_link_hibern8(hba)) { in ufs_mtk_suspend()
950 err = ufs_mtk_link_set_lpm(hba); in ufs_mtk_suspend()
955 if (!ufshcd_is_link_active(hba)) { in ufs_mtk_suspend()
961 ufs_mtk_vreg_set_lpm(hba, true); in ufs_mtk_suspend()
962 err = ufs_mtk_mphy_power_on(hba, false); in ufs_mtk_suspend()
967 if (ufshcd_is_link_off(hba)) in ufs_mtk_suspend()
977 ufshcd_set_link_off(hba); in ufs_mtk_suspend()
981 static int ufs_mtk_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) in ufs_mtk_resume() argument
985 err = ufs_mtk_mphy_power_on(hba, true); in ufs_mtk_resume()
989 ufs_mtk_vreg_set_lpm(hba, false); in ufs_mtk_resume()
991 if (ufshcd_is_link_hibern8(hba)) { in ufs_mtk_resume()
992 err = ufs_mtk_link_set_hpm(hba); in ufs_mtk_resume()
999 return ufshcd_link_recovery(hba); in ufs_mtk_resume()
1002 static void ufs_mtk_dbg_register_dump(struct ufs_hba *hba) in ufs_mtk_dbg_register_dump() argument
1004 ufshcd_dump_regs(hba, REG_UFS_REFCLK_CTRL, 0x4, "Ref-Clk Ctrl "); in ufs_mtk_dbg_register_dump()
1006 ufshcd_dump_regs(hba, REG_UFS_EXTREG, 0x4, "Ext Reg "); in ufs_mtk_dbg_register_dump()
1008 ufshcd_dump_regs(hba, REG_UFS_MPHYCTRL, in ufs_mtk_dbg_register_dump()
1013 ufshcd_writel(hba, 0x20, REG_UFS_DEBUG_SEL); in ufs_mtk_dbg_register_dump()
1014 ufshcd_dump_regs(hba, REG_UFS_PROBE, 0x4, "Debug Probe "); in ufs_mtk_dbg_register_dump()
1017 static int ufs_mtk_apply_dev_quirks(struct ufs_hba *hba) in ufs_mtk_apply_dev_quirks() argument
1019 struct ufs_dev_info *dev_info = &hba->dev_info; in ufs_mtk_apply_dev_quirks()
1023 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TACTIVATE), 6); in ufs_mtk_apply_dev_quirks()
1031 ufs_mtk_setup_ref_clk_wait_us(hba, 1, 1); in ufs_mtk_apply_dev_quirks()
1033 ufs_mtk_setup_ref_clk_wait_us(hba, 30, 30); in ufs_mtk_apply_dev_quirks()
1035 ufs_mtk_setup_ref_clk_wait_us(hba, 100, 32); in ufs_mtk_apply_dev_quirks()
1040 static void ufs_mtk_fixup_dev_quirks(struct ufs_hba *hba) in ufs_mtk_fixup_dev_quirks() argument
1042 ufshcd_fixup_dev_quirks(hba, ufs_mtk_dev_fixups); in ufs_mtk_fixup_dev_quirks()
1044 if (ufs_mtk_is_broken_vcc(hba) && hba->vreg_info.vcc && in ufs_mtk_fixup_dev_quirks()
1045 (hba->dev_quirks & UFS_DEVICE_QUIRK_DELAY_AFTER_LPM)) { in ufs_mtk_fixup_dev_quirks()
1046 hba->vreg_info.vcc->always_on = true; in ufs_mtk_fixup_dev_quirks()
1051 hba->dev_quirks &= ~(UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM | in ufs_mtk_fixup_dev_quirks()
1056 static void ufs_mtk_event_notify(struct ufs_hba *hba, in ufs_mtk_event_notify() argument
1144 struct ufs_hba *hba = platform_get_drvdata(pdev); in ufs_mtk_remove() local
1147 ufshcd_remove(hba); in ufs_mtk_remove()