Lines Matching refs:hba
24 void (*late_init)(struct ufs_hba *hba);
97 static int ufs_intel_hce_enable_notify(struct ufs_hba *hba,
101 if (status == POST_CHANGE && hba->caps & UFSHCD_CAP_CRYPTO) {
102 u32 hce = ufshcd_readl(hba, REG_CONTROLLER_ENABLE);
105 ufshcd_writel(hba, hce, REG_CONTROLLER_ENABLE);
111 static int ufs_intel_disable_lcc(struct ufs_hba *hba)
116 ufshcd_dme_get(hba, attr, &lcc_enable);
118 ufshcd_disable_host_tx_lcc(hba);
123 static int ufs_intel_link_startup_notify(struct ufs_hba *hba,
130 err = ufs_intel_disable_lcc(hba);
141 static int ufs_intel_set_lanes(struct ufs_hba *hba, u32 lanes)
143 struct ufs_pa_layer_attr pwr_info = hba->pwr_info;
148 ret = ufshcd_config_pwr_mode(hba, &pwr_info);
150 dev_err(hba->dev, "%s: Setting %u lanes, err = %d\n",
155 static int ufs_intel_lkf_pwr_change_notify(struct ufs_hba *hba,
165 (hba->pwr_info.lane_rx != 2 || hba->pwr_info.lane_tx != 2))
166 ufs_intel_set_lanes(hba, 2);
174 err = ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_GRANULARITY),
185 static int ufs_intel_lkf_apply_dev_quirks(struct ufs_hba *hba)
191 ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_GRANULARITY), &granularity);
195 ret = ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_GRANULARITY), &peer_granularity);
199 ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_TACTIVATE), &pa_tactivate);
203 ret = ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_TACTIVATE), &peer_pa_tactivate);
210 ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(PA_TACTIVATE), new_peer_pa_tactivate);
225 static void intel_cache_ltr(struct ufs_hba *hba)
227 struct intel_host *host = ufshcd_get_variant(hba);
229 host->active_ltr = readl(hba->mmio_base + INTEL_ACTIVELTR);
230 host->idle_ltr = readl(hba->mmio_base + INTEL_IDLELTR);
235 struct ufs_hba *hba = dev_get_drvdata(dev);
236 struct intel_host *host = ufshcd_get_variant(hba);
246 ltr = readl(hba->mmio_base + INTEL_ACTIVELTR);
268 writel(ltr, hba->mmio_base + INTEL_ACTIVELTR);
269 writel(ltr, hba->mmio_base + INTEL_IDLELTR);
272 intel_cache_ltr(hba);
289 static void intel_add_debugfs(struct ufs_hba *hba)
291 struct dentry *dir = debugfs_create_dir(dev_name(hba->dev), NULL);
292 struct intel_host *host = ufshcd_get_variant(hba);
294 intel_cache_ltr(hba);
301 static void intel_remove_debugfs(struct ufs_hba *hba)
303 struct intel_host *host = ufshcd_get_variant(hba);
308 static int ufs_intel_device_reset(struct ufs_hba *hba)
310 struct intel_host *host = ufshcd_get_variant(hba);
316 err = intel_dsm(host, hba->dev, INTEL_DSM_RESET, &result);
320 dev_err(hba->dev, "%s: DSM error %d result %u\n",
343 static int ufs_intel_common_init(struct ufs_hba *hba)
347 hba->caps |= UFSHCD_CAP_RPM_AUTOSUSPEND;
349 host = devm_kzalloc(hba->dev, sizeof(*host), GFP_KERNEL);
352 ufshcd_set_variant(hba, host);
353 intel_dsm_init(host, hba->dev);
355 if (hba->vops->device_reset)
356 hba->caps |= UFSHCD_CAP_DEEPSLEEP;
358 if (hba->vops->device_reset)
359 host->reset_gpio = ufs_intel_get_reset_gpio(hba->dev);
361 dev_err(hba->dev, "%s: failed to get reset GPIO, error %ld\n",
367 hba->caps |= UFSHCD_CAP_DEEPSLEEP;
370 intel_ltr_expose(hba->dev);
371 intel_add_debugfs(hba);
375 static void ufs_intel_common_exit(struct ufs_hba *hba)
377 intel_remove_debugfs(hba);
378 intel_ltr_hide(hba->dev);
381 static int ufs_intel_resume(struct ufs_hba *hba, enum ufs_pm_op op)
383 if (ufshcd_is_link_hibern8(hba)) {
384 int ret = ufshcd_uic_hibern8_exit(hba);
387 ufshcd_set_link_active(hba);
389 dev_err(hba->dev, "%s: hibern8 exit failed %d\n",
395 ufshcd_set_link_off(hba);
402 static int ufs_intel_ehl_init(struct ufs_hba *hba)
404 hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8;
405 return ufs_intel_common_init(hba);
408 static void ufs_intel_lkf_late_init(struct ufs_hba *hba)
411 if (hba->caps & UFSHCD_CAP_DEEPSLEEP) {
412 hba->spm_lvl = UFS_PM_LVL_6;
413 hba->rpm_lvl = UFS_PM_LVL_6;
415 hba->spm_lvl = UFS_PM_LVL_5;
416 hba->rpm_lvl = UFS_PM_LVL_5;
420 static int ufs_intel_lkf_init(struct ufs_hba *hba)
425 hba->nop_out_timeout = 200;
426 hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8;
427 hba->caps |= UFSHCD_CAP_CRYPTO;
428 err = ufs_intel_common_init(hba);
429 ufs_host = ufshcd_get_variant(hba);
434 static int ufs_intel_adl_init(struct ufs_hba *hba)
436 hba->nop_out_timeout = 200;
437 hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8;
438 hba->caps |= UFSHCD_CAP_WB_EN;
439 return ufs_intel_common_init(hba);
442 static int ufs_intel_mtl_init(struct ufs_hba *hba)
444 hba->caps |= UFSHCD_CAP_CRYPTO | UFSHCD_CAP_WB_EN;
445 return ufs_intel_common_init(hba);
498 struct ufs_hba *hba = dev_get_drvdata(dev);
501 ufshcd_set_link_off(hba);
514 struct ufs_hba *hba = pci_get_drvdata(pdev);
518 ufshcd_remove(hba);
519 ufshcd_dealloc_host(hba);
533 struct ufs_hba *hba;
553 err = ufshcd_alloc_host(&pdev->dev, &hba);
559 hba->vops = (struct ufs_hba_variant_ops *)id->driver_data;
561 err = ufshcd_init(hba, mmio_base, pdev->irq);
564 ufshcd_dealloc_host(hba);
568 ufs_host = ufshcd_get_variant(hba);
570 ufs_host->late_init(hba);