Lines Matching refs:hba
63 static bool ufs_mtk_is_boost_crypt_enabled(struct ufs_hba *hba) in ufs_mtk_is_boost_crypt_enabled() argument
65 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_is_boost_crypt_enabled()
70 static void ufs_mtk_cfg_unipro_cg(struct ufs_hba *hba, bool enable) in ufs_mtk_cfg_unipro_cg() argument
75 ufshcd_dme_get(hba, in ufs_mtk_cfg_unipro_cg()
81 ufshcd_dme_set(hba, in ufs_mtk_cfg_unipro_cg()
84 ufshcd_dme_get(hba, in ufs_mtk_cfg_unipro_cg()
87 ufshcd_dme_set(hba, in ufs_mtk_cfg_unipro_cg()
90 ufshcd_dme_get(hba, in ufs_mtk_cfg_unipro_cg()
95 ufshcd_dme_set(hba, in ufs_mtk_cfg_unipro_cg()
98 ufshcd_dme_get(hba, in ufs_mtk_cfg_unipro_cg()
101 ufshcd_dme_set(hba, in ufs_mtk_cfg_unipro_cg()
106 static void ufs_mtk_crypto_enable(struct ufs_hba *hba) in ufs_mtk_crypto_enable() argument
112 dev_info(hba->dev, "%s: crypto enable failed, err: %lu\n", in ufs_mtk_crypto_enable()
114 hba->caps &= ~UFSHCD_CAP_CRYPTO; in ufs_mtk_crypto_enable()
118 static void ufs_mtk_host_reset(struct ufs_hba *hba) in ufs_mtk_host_reset() argument
120 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_host_reset()
133 static void ufs_mtk_init_reset_control(struct ufs_hba *hba, in ufs_mtk_init_reset_control() argument
137 *rc = devm_reset_control_get(hba->dev, str); in ufs_mtk_init_reset_control()
139 dev_info(hba->dev, "Failed to get reset control %s: %ld\n", in ufs_mtk_init_reset_control()
145 static void ufs_mtk_init_reset(struct ufs_hba *hba) in ufs_mtk_init_reset() argument
147 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_init_reset()
149 ufs_mtk_init_reset_control(hba, &host->hci_reset, in ufs_mtk_init_reset()
151 ufs_mtk_init_reset_control(hba, &host->unipro_reset, in ufs_mtk_init_reset()
153 ufs_mtk_init_reset_control(hba, &host->crypto_reset, in ufs_mtk_init_reset()
157 static int ufs_mtk_hce_enable_notify(struct ufs_hba *hba, in ufs_mtk_hce_enable_notify() argument
160 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_hce_enable_notify()
164 hba->vps->hba_enable_delay_us = 0; in ufs_mtk_hce_enable_notify()
166 hba->vps->hba_enable_delay_us = 600; in ufs_mtk_hce_enable_notify()
167 ufs_mtk_host_reset(hba); in ufs_mtk_hce_enable_notify()
170 if (hba->caps & UFSHCD_CAP_CRYPTO) in ufs_mtk_hce_enable_notify()
171 ufs_mtk_crypto_enable(hba); in ufs_mtk_hce_enable_notify()
177 static int ufs_mtk_bind_mphy(struct ufs_hba *hba) in ufs_mtk_bind_mphy() argument
179 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_bind_mphy()
180 struct device *dev = hba->dev; in ufs_mtk_bind_mphy()
215 static int ufs_mtk_setup_ref_clk(struct ufs_hba *hba, bool on) in ufs_mtk_setup_ref_clk() argument
217 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_setup_ref_clk()
228 ufshcd_writel(hba, REFCLK_REQUEST, REG_UFS_REFCLK_CTRL); in ufs_mtk_setup_ref_clk()
230 ufshcd_writel(hba, REFCLK_RELEASE, REG_UFS_REFCLK_CTRL); in ufs_mtk_setup_ref_clk()
237 value = ufshcd_readl(hba, REG_UFS_REFCLK_CTRL); in ufs_mtk_setup_ref_clk()
246 dev_err(hba->dev, "missing ack of refclk req, reg: 0x%x\n", value); in ufs_mtk_setup_ref_clk()
262 static void ufs_mtk_setup_ref_clk_wait_us(struct ufs_hba *hba, in ufs_mtk_setup_ref_clk_wait_us() argument
265 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_setup_ref_clk_wait_us()
267 if (hba->dev_info.clk_gating_wait_us) { in ufs_mtk_setup_ref_clk_wait_us()
269 hba->dev_info.clk_gating_wait_us; in ufs_mtk_setup_ref_clk_wait_us()
277 static int ufs_mtk_wait_link_state(struct ufs_hba *hba, u32 state, in ufs_mtk_wait_link_state() argument
286 ufshcd_writel(hba, 0x20, REG_UFS_DEBUG_SEL); in ufs_mtk_wait_link_state()
287 val = ufshcd_readl(hba, REG_UFS_PROBE); in ufs_mtk_wait_link_state()
303 static void ufs_mtk_mphy_power_on(struct ufs_hba *hba, bool on) in ufs_mtk_mphy_power_on() argument
305 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_mphy_power_on()
335 static void ufs_mtk_boost_crypt(struct ufs_hba *hba, bool boost) in ufs_mtk_boost_crypt() argument
337 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_boost_crypt()
342 if (!ufs_mtk_is_boost_crypt_enabled(hba)) in ufs_mtk_boost_crypt()
351 dev_info(hba->dev, "clk_prepare_enable(): %d\n", in ufs_mtk_boost_crypt()
359 dev_info(hba->dev, in ufs_mtk_boost_crypt()
367 dev_info(hba->dev, in ufs_mtk_boost_crypt()
376 dev_info(hba->dev, in ufs_mtk_boost_crypt()
383 dev_info(hba->dev, in ufs_mtk_boost_crypt()
391 static int ufs_mtk_init_host_clk(struct ufs_hba *hba, const char *name, in ufs_mtk_init_host_clk() argument
396 ret = ufs_mtk_get_host_clk(hba->dev, name, clk); in ufs_mtk_init_host_clk()
398 dev_info(hba->dev, "%s: failed to get %s: %d", __func__, in ufs_mtk_init_host_clk()
405 static void ufs_mtk_init_host_caps(struct ufs_hba *hba) in ufs_mtk_init_host_caps() argument
407 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_init_host_caps()
409 struct device *dev = hba->dev; in ufs_mtk_init_host_caps()
415 if (!ufs_mtk_is_boost_crypt_enabled(hba)) in ufs_mtk_init_host_caps()
437 if (ufs_mtk_init_host_clk(hba, "crypt_mux", in ufs_mtk_init_host_caps()
441 if (ufs_mtk_init_host_clk(hba, "crypt_lp", in ufs_mtk_init_host_caps()
445 if (ufs_mtk_init_host_clk(hba, "crypt_perf", in ufs_mtk_init_host_caps()
466 static int ufs_mtk_setup_clocks(struct ufs_hba *hba, bool on, in ufs_mtk_setup_clocks() argument
469 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_setup_clocks()
482 if (ufshcd_is_link_off(hba)) { in ufs_mtk_setup_clocks()
484 } else if (ufshcd_is_link_hibern8(hba) || in ufs_mtk_setup_clocks()
485 (!ufshcd_can_hibern8_during_gating(hba) && in ufs_mtk_setup_clocks()
486 ufshcd_is_auto_hibern8_enabled(hba))) { in ufs_mtk_setup_clocks()
492 ret = ufs_mtk_wait_link_state(hba, in ufs_mtk_setup_clocks()
500 ufs_mtk_boost_crypt(hba, on); in ufs_mtk_setup_clocks()
501 ufs_mtk_setup_ref_clk(hba, on); in ufs_mtk_setup_clocks()
502 ufs_mtk_mphy_power_on(hba, on); in ufs_mtk_setup_clocks()
505 ufs_mtk_mphy_power_on(hba, on); in ufs_mtk_setup_clocks()
506 ufs_mtk_setup_ref_clk(hba, on); in ufs_mtk_setup_clocks()
507 ufs_mtk_boost_crypt(hba, on); in ufs_mtk_setup_clocks()
523 static int ufs_mtk_init(struct ufs_hba *hba) in ufs_mtk_init() argument
526 struct device *dev = hba->dev; in ufs_mtk_init()
537 host->hba = hba; in ufs_mtk_init()
538 ufshcd_set_variant(hba, host); in ufs_mtk_init()
549 ufs_mtk_init_host_caps(hba); in ufs_mtk_init()
552 err = ufs_mtk_bind_mphy(hba); in ufs_mtk_init()
556 ufs_mtk_init_reset(hba); in ufs_mtk_init()
559 hba->caps |= UFSHCD_CAP_RPM_AUTOSUSPEND; in ufs_mtk_init()
562 hba->caps |= UFSHCD_CAP_CLK_GATING; in ufs_mtk_init()
565 hba->caps |= UFSHCD_CAP_CRYPTO; in ufs_mtk_init()
568 hba->caps |= UFSHCD_CAP_WB_EN; in ufs_mtk_init()
569 hba->quirks |= UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL; in ufs_mtk_init()
570 hba->vps->wb_flush_threshold = UFS_WB_BUF_REMAIN_PERCENT(80); in ufs_mtk_init()
579 ufs_mtk_setup_clocks(hba, true, POST_CHANGE); in ufs_mtk_init()
584 ufshcd_set_variant(hba, NULL); in ufs_mtk_init()
589 static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba, in ufs_mtk_pre_pwr_change() argument
621 static int ufs_mtk_pwr_change_notify(struct ufs_hba *hba, in ufs_mtk_pwr_change_notify() argument
630 ret = ufs_mtk_pre_pwr_change(hba, dev_max_params, in ufs_mtk_pwr_change_notify()
643 static int ufs_mtk_unipro_set_pm(struct ufs_hba *hba, bool lpm) in ufs_mtk_unipro_set_pm() argument
646 struct ufs_mtk_host *host = ufshcd_get_variant(hba); in ufs_mtk_unipro_set_pm()
648 ret = ufshcd_dme_set(hba, in ufs_mtk_unipro_set_pm()
663 static int ufs_mtk_pre_link(struct ufs_hba *hba) in ufs_mtk_pre_link() argument
668 ret = ufs_mtk_unipro_set_pm(hba, false); in ufs_mtk_pre_link()
677 ret = ufshcd_disable_host_tx_lcc(hba); in ufs_mtk_pre_link()
682 ret = ufshcd_dme_get(hba, UIC_ARG_MIB(VS_SAVEPOWERCONTROL), &tmp); in ufs_mtk_pre_link()
688 ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_SAVEPOWERCONTROL), tmp); in ufs_mtk_pre_link()
693 static void ufs_mtk_setup_clk_gating(struct ufs_hba *hba) in ufs_mtk_setup_clk_gating() argument
698 if (ufshcd_is_clkgating_allowed(hba)) { in ufs_mtk_setup_clk_gating()
699 if (ufshcd_is_auto_hibern8_supported(hba) && hba->ahit) in ufs_mtk_setup_clk_gating()
701 hba->ahit); in ufs_mtk_setup_clk_gating()
704 spin_lock_irqsave(hba->host->host_lock, flags); in ufs_mtk_setup_clk_gating()
705 hba->clk_gating.delay_ms = ah_ms + 5; in ufs_mtk_setup_clk_gating()
706 spin_unlock_irqrestore(hba->host->host_lock, flags); in ufs_mtk_setup_clk_gating()
710 static int ufs_mtk_post_link(struct ufs_hba *hba) in ufs_mtk_post_link() argument
713 ufs_mtk_cfg_unipro_cg(hba, true); in ufs_mtk_post_link()
716 if (ufshcd_is_auto_hibern8_supported(hba)) { in ufs_mtk_post_link()
717 ufshcd_auto_hibern8_update(hba, in ufs_mtk_post_link()
722 ufs_mtk_setup_clk_gating(hba); in ufs_mtk_post_link()
727 static int ufs_mtk_link_startup_notify(struct ufs_hba *hba, in ufs_mtk_link_startup_notify() argument
734 ret = ufs_mtk_pre_link(hba); in ufs_mtk_link_startup_notify()
737 ret = ufs_mtk_post_link(hba); in ufs_mtk_link_startup_notify()
747 static int ufs_mtk_device_reset(struct ufs_hba *hba) in ufs_mtk_device_reset() argument
767 dev_info(hba->dev, "device reset done\n"); in ufs_mtk_device_reset()
772 static int ufs_mtk_link_set_hpm(struct ufs_hba *hba) in ufs_mtk_link_set_hpm() argument
776 err = ufshcd_hba_enable(hba); in ufs_mtk_link_set_hpm()
780 err = ufs_mtk_unipro_set_pm(hba, false); in ufs_mtk_link_set_hpm()
784 err = ufshcd_uic_hibern8_exit(hba); in ufs_mtk_link_set_hpm()
786 ufshcd_set_link_active(hba); in ufs_mtk_link_set_hpm()
790 err = ufshcd_make_hba_operational(hba); in ufs_mtk_link_set_hpm()
797 static int ufs_mtk_link_set_lpm(struct ufs_hba *hba) in ufs_mtk_link_set_lpm() argument
801 err = ufs_mtk_unipro_set_pm(hba, true); in ufs_mtk_link_set_lpm()
804 ufs_mtk_unipro_set_pm(hba, false); in ufs_mtk_link_set_lpm()
811 static void ufs_mtk_vreg_set_lpm(struct ufs_hba *hba, bool lpm) in ufs_mtk_vreg_set_lpm() argument
813 if (!hba->vreg_info.vccq2 || !hba->vreg_info.vcc) in ufs_mtk_vreg_set_lpm()
816 if (lpm && !hba->vreg_info.vcc->enabled) in ufs_mtk_vreg_set_lpm()
817 regulator_set_mode(hba->vreg_info.vccq2->reg, in ufs_mtk_vreg_set_lpm()
820 regulator_set_mode(hba->vreg_info.vccq2->reg, in ufs_mtk_vreg_set_lpm()
824 static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) in ufs_mtk_suspend() argument
829 if (ufshcd_is_link_hibern8(hba)) { in ufs_mtk_suspend()
830 err = ufs_mtk_link_set_lpm(hba); in ufs_mtk_suspend()
837 ufshcd_set_link_off(hba); in ufs_mtk_suspend()
845 ufs_mtk_vreg_set_lpm(hba, true); in ufs_mtk_suspend()
848 if (ufshcd_is_link_off(hba)) in ufs_mtk_suspend()
854 static int ufs_mtk_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) in ufs_mtk_resume() argument
858 if (ufshcd_is_link_hibern8(hba)) { in ufs_mtk_resume()
859 ufs_mtk_vreg_set_lpm(hba, false); in ufs_mtk_resume()
860 err = ufs_mtk_link_set_hpm(hba); in ufs_mtk_resume()
862 err = ufshcd_link_recovery(hba); in ufs_mtk_resume()
870 static void ufs_mtk_dbg_register_dump(struct ufs_hba *hba) in ufs_mtk_dbg_register_dump() argument
872 ufshcd_dump_regs(hba, REG_UFS_REFCLK_CTRL, 0x4, "Ref-Clk Ctrl "); in ufs_mtk_dbg_register_dump()
874 ufshcd_dump_regs(hba, REG_UFS_EXTREG, 0x4, "Ext Reg "); in ufs_mtk_dbg_register_dump()
876 ufshcd_dump_regs(hba, REG_UFS_MPHYCTRL, in ufs_mtk_dbg_register_dump()
881 ufshcd_writel(hba, 0x20, REG_UFS_DEBUG_SEL); in ufs_mtk_dbg_register_dump()
882 ufshcd_dump_regs(hba, REG_UFS_PROBE, 0x4, "Debug Probe "); in ufs_mtk_dbg_register_dump()
885 static int ufs_mtk_apply_dev_quirks(struct ufs_hba *hba) in ufs_mtk_apply_dev_quirks() argument
887 struct ufs_dev_info *dev_info = &hba->dev_info; in ufs_mtk_apply_dev_quirks()
891 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TACTIVATE), 6); in ufs_mtk_apply_dev_quirks()
899 ufs_mtk_setup_ref_clk_wait_us(hba, 1, 1); in ufs_mtk_apply_dev_quirks()
901 ufs_mtk_setup_ref_clk_wait_us(hba, 30, 30); in ufs_mtk_apply_dev_quirks()
903 ufs_mtk_setup_ref_clk_wait_us(hba, 100, 32); in ufs_mtk_apply_dev_quirks()
908 static void ufs_mtk_fixup_dev_quirks(struct ufs_hba *hba) in ufs_mtk_fixup_dev_quirks() argument
910 ufshcd_fixup_dev_quirks(hba, ufs_mtk_dev_fixups); in ufs_mtk_fixup_dev_quirks()
961 struct ufs_hba *hba = platform_get_drvdata(pdev); in ufs_mtk_remove() local
964 ufshcd_remove(hba); in ufs_mtk_remove()