Lines Matching refs:hba
23 void (*late_init)(struct ufs_hba *hba);
87 static int ufs_intel_hce_enable_notify(struct ufs_hba *hba, in ufs_intel_hce_enable_notify() argument
91 if (status == POST_CHANGE && hba->caps & UFSHCD_CAP_CRYPTO) { in ufs_intel_hce_enable_notify()
92 u32 hce = ufshcd_readl(hba, REG_CONTROLLER_ENABLE); in ufs_intel_hce_enable_notify()
95 ufshcd_writel(hba, hce, REG_CONTROLLER_ENABLE); in ufs_intel_hce_enable_notify()
101 static int ufs_intel_disable_lcc(struct ufs_hba *hba) in ufs_intel_disable_lcc() argument
106 ufshcd_dme_get(hba, attr, &lcc_enable); in ufs_intel_disable_lcc()
108 ufshcd_disable_host_tx_lcc(hba); in ufs_intel_disable_lcc()
113 static int ufs_intel_link_startup_notify(struct ufs_hba *hba, in ufs_intel_link_startup_notify() argument
120 err = ufs_intel_disable_lcc(hba); in ufs_intel_link_startup_notify()
131 static int ufs_intel_set_lanes(struct ufs_hba *hba, u32 lanes) in ufs_intel_set_lanes() argument
133 struct ufs_pa_layer_attr pwr_info = hba->pwr_info; in ufs_intel_set_lanes()
138 ret = ufshcd_config_pwr_mode(hba, &pwr_info); in ufs_intel_set_lanes()
140 dev_err(hba->dev, "%s: Setting %u lanes, err = %d\n", in ufs_intel_set_lanes()
145 static int ufs_intel_lkf_pwr_change_notify(struct ufs_hba *hba, in ufs_intel_lkf_pwr_change_notify() argument
155 (hba->pwr_info.lane_rx != 2 || hba->pwr_info.lane_tx != 2)) in ufs_intel_lkf_pwr_change_notify()
156 ufs_intel_set_lanes(hba, 2); in ufs_intel_lkf_pwr_change_notify()
164 err = ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_GRANULARITY), in ufs_intel_lkf_pwr_change_notify()
175 static int ufs_intel_lkf_apply_dev_quirks(struct ufs_hba *hba) in ufs_intel_lkf_apply_dev_quirks() argument
181 ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_GRANULARITY), &granularity); in ufs_intel_lkf_apply_dev_quirks()
185 ret = ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_GRANULARITY), &peer_granularity); in ufs_intel_lkf_apply_dev_quirks()
189 ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_TACTIVATE), &pa_tactivate); in ufs_intel_lkf_apply_dev_quirks()
193 ret = ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_TACTIVATE), &peer_pa_tactivate); in ufs_intel_lkf_apply_dev_quirks()
200 ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(PA_TACTIVATE), new_peer_pa_tactivate); in ufs_intel_lkf_apply_dev_quirks()
215 static void intel_cache_ltr(struct ufs_hba *hba) in intel_cache_ltr() argument
217 struct intel_host *host = ufshcd_get_variant(hba); in intel_cache_ltr()
219 host->active_ltr = readl(hba->mmio_base + INTEL_ACTIVELTR); in intel_cache_ltr()
220 host->idle_ltr = readl(hba->mmio_base + INTEL_IDLELTR); in intel_cache_ltr()
225 struct ufs_hba *hba = dev_get_drvdata(dev); in intel_ltr_set() local
226 struct intel_host *host = ufshcd_get_variant(hba); in intel_ltr_set()
236 ltr = readl(hba->mmio_base + INTEL_ACTIVELTR); in intel_ltr_set()
258 writel(ltr, hba->mmio_base + INTEL_ACTIVELTR); in intel_ltr_set()
259 writel(ltr, hba->mmio_base + INTEL_IDLELTR); in intel_ltr_set()
262 intel_cache_ltr(hba); in intel_ltr_set()
279 static void intel_add_debugfs(struct ufs_hba *hba) in intel_add_debugfs() argument
281 struct dentry *dir = debugfs_create_dir(dev_name(hba->dev), NULL); in intel_add_debugfs()
282 struct intel_host *host = ufshcd_get_variant(hba); in intel_add_debugfs()
284 intel_cache_ltr(hba); in intel_add_debugfs()
291 static void intel_remove_debugfs(struct ufs_hba *hba) in intel_remove_debugfs() argument
293 struct intel_host *host = ufshcd_get_variant(hba); in intel_remove_debugfs()
298 static int ufs_intel_device_reset(struct ufs_hba *hba) in ufs_intel_device_reset() argument
300 struct intel_host *host = ufshcd_get_variant(hba); in ufs_intel_device_reset()
306 err = intel_dsm(host, hba->dev, INTEL_DSM_RESET, &result); in ufs_intel_device_reset()
310 dev_err(hba->dev, "%s: DSM error %d result %u\n", in ufs_intel_device_reset()
333 static int ufs_intel_common_init(struct ufs_hba *hba) in ufs_intel_common_init() argument
337 hba->caps |= UFSHCD_CAP_RPM_AUTOSUSPEND; in ufs_intel_common_init()
339 host = devm_kzalloc(hba->dev, sizeof(*host), GFP_KERNEL); in ufs_intel_common_init()
342 ufshcd_set_variant(hba, host); in ufs_intel_common_init()
343 intel_dsm_init(host, hba->dev); in ufs_intel_common_init()
345 if (hba->vops->device_reset) in ufs_intel_common_init()
346 hba->caps |= UFSHCD_CAP_DEEPSLEEP; in ufs_intel_common_init()
348 if (hba->vops->device_reset) in ufs_intel_common_init()
349 host->reset_gpio = ufs_intel_get_reset_gpio(hba->dev); in ufs_intel_common_init()
351 dev_err(hba->dev, "%s: failed to get reset GPIO, error %ld\n", in ufs_intel_common_init()
357 hba->caps |= UFSHCD_CAP_DEEPSLEEP; in ufs_intel_common_init()
360 intel_ltr_expose(hba->dev); in ufs_intel_common_init()
361 intel_add_debugfs(hba); in ufs_intel_common_init()
365 static void ufs_intel_common_exit(struct ufs_hba *hba) in ufs_intel_common_exit() argument
367 intel_remove_debugfs(hba); in ufs_intel_common_exit()
368 intel_ltr_hide(hba->dev); in ufs_intel_common_exit()
371 static int ufs_intel_resume(struct ufs_hba *hba, enum ufs_pm_op op) in ufs_intel_resume() argument
373 if (ufshcd_is_link_hibern8(hba)) { in ufs_intel_resume()
374 int ret = ufshcd_uic_hibern8_exit(hba); in ufs_intel_resume()
377 ufshcd_set_link_active(hba); in ufs_intel_resume()
379 dev_err(hba->dev, "%s: hibern8 exit failed %d\n", in ufs_intel_resume()
385 ufshcd_set_link_off(hba); in ufs_intel_resume()
392 static int ufs_intel_ehl_init(struct ufs_hba *hba) in ufs_intel_ehl_init() argument
394 hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8; in ufs_intel_ehl_init()
395 return ufs_intel_common_init(hba); in ufs_intel_ehl_init()
398 static void ufs_intel_lkf_late_init(struct ufs_hba *hba) in ufs_intel_lkf_late_init() argument
401 if (hba->caps & UFSHCD_CAP_DEEPSLEEP) { in ufs_intel_lkf_late_init()
402 hba->spm_lvl = UFS_PM_LVL_6; in ufs_intel_lkf_late_init()
403 hba->rpm_lvl = UFS_PM_LVL_6; in ufs_intel_lkf_late_init()
405 hba->spm_lvl = UFS_PM_LVL_5; in ufs_intel_lkf_late_init()
406 hba->rpm_lvl = UFS_PM_LVL_5; in ufs_intel_lkf_late_init()
410 static int ufs_intel_lkf_init(struct ufs_hba *hba) in ufs_intel_lkf_init() argument
415 hba->nop_out_timeout = 200; in ufs_intel_lkf_init()
416 hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8; in ufs_intel_lkf_init()
417 hba->caps |= UFSHCD_CAP_CRYPTO; in ufs_intel_lkf_init()
418 err = ufs_intel_common_init(hba); in ufs_intel_lkf_init()
419 ufs_host = ufshcd_get_variant(hba); in ufs_intel_lkf_init()
424 static int ufs_intel_adl_init(struct ufs_hba *hba) in ufs_intel_adl_init() argument
426 hba->nop_out_timeout = 200; in ufs_intel_adl_init()
427 hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8; in ufs_intel_adl_init()
428 return ufs_intel_common_init(hba); in ufs_intel_adl_init()
431 static int ufs_intel_mtl_init(struct ufs_hba *hba) in ufs_intel_mtl_init() argument
433 hba->caps |= UFSHCD_CAP_CRYPTO | UFSHCD_CAP_WB_EN; in ufs_intel_mtl_init()
434 return ufs_intel_common_init(hba); in ufs_intel_mtl_init()
487 struct ufs_hba *hba = dev_get_drvdata(dev); in ufshcd_pci_restore() local
490 ufshcd_set_link_off(hba); in ufshcd_pci_restore()
512 struct ufs_hba *hba = pci_get_drvdata(pdev); in ufshcd_pci_remove() local
516 ufshcd_remove(hba); in ufshcd_pci_remove()
517 ufshcd_dealloc_host(hba); in ufshcd_pci_remove()
531 struct ufs_hba *hba; in ufshcd_pci_probe() local
551 err = ufshcd_alloc_host(&pdev->dev, &hba); in ufshcd_pci_probe()
557 hba->vops = (struct ufs_hba_variant_ops *)id->driver_data; in ufshcd_pci_probe()
559 err = ufshcd_init(hba, mmio_base, pdev->irq); in ufshcd_pci_probe()
562 ufshcd_dealloc_host(hba); in ufshcd_pci_probe()
566 ufs_host = ufshcd_get_variant(hba); in ufshcd_pci_probe()
568 ufs_host->late_init(hba); in ufshcd_pci_probe()