Lines Matching +full:needs +full:- +full:reset +full:- +full:on +full:- +full:resume

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2011-2013 Samsung India Software Operations
48 return fn < 32 && fn >= 0 && (host->dsm_fns & (1u << fn)); in __intel_dsm_supported()
63 return -EOPNOTSUPP; in __intel_dsm()
65 if (obj->type != ACPI_TYPE_BUFFER || obj->buffer.length < 1) { in __intel_dsm()
66 err = -EINVAL; in __intel_dsm()
70 len = min_t(size_t, obj->buffer.length, 4); in __intel_dsm()
73 memcpy(result, obj->buffer.pointer, len); in __intel_dsm()
84 return -EOPNOTSUPP; in intel_dsm()
93 err = __intel_dsm(intel_host, dev, INTEL_DSM_FNS, &intel_host->dsm_fns); in intel_dsm_init()
94 dev_dbg(dev, "DSM fns %#x, error %d\n", intel_host->dsm_fns, err); in intel_dsm_init()
101 if (status == POST_CHANGE && hba->caps & UFSHCD_CAP_CRYPTO) { in ufs_intel_hce_enable_notify()
143 struct ufs_pa_layer_attr pwr_info = hba->pwr_info; in ufs_intel_set_lanes()
150 dev_err(hba->dev, "%s: Setting %u lanes, err = %d\n", in ufs_intel_set_lanes()
165 (hba->pwr_info.lane_rx != 2 || hba->pwr_info.lane_tx != 2)) in ufs_intel_lkf_pwr_change_notify()
229 host->active_ltr = readl(hba->mmio_base + INTEL_ACTIVELTR); in intel_cache_ltr()
230 host->idle_ltr = readl(hba->mmio_base + INTEL_IDLELTR); in intel_cache_ltr()
246 ltr = readl(hba->mmio_base + INTEL_ACTIVELTR); in intel_ltr_set()
265 if (ltr == host->active_ltr) in intel_ltr_set()
268 writel(ltr, hba->mmio_base + INTEL_ACTIVELTR); in intel_ltr_set()
269 writel(ltr, hba->mmio_base + INTEL_IDLELTR); in intel_ltr_set()
279 dev->power.set_latency_tolerance = intel_ltr_set; in intel_ltr_expose()
286 dev->power.set_latency_tolerance = NULL; in intel_ltr_hide()
291 struct dentry *dir = debugfs_create_dir(dev_name(hba->dev), NULL); in intel_add_debugfs()
296 host->debugfs_root = dir; in intel_add_debugfs()
297 debugfs_create_x32("active_ltr", 0444, dir, &host->active_ltr); in intel_add_debugfs()
298 debugfs_create_x32("idle_ltr", 0444, dir, &host->idle_ltr); in intel_add_debugfs()
305 debugfs_remove_recursive(host->debugfs_root); in intel_remove_debugfs()
312 if (INTEL_DSM_SUPPORTED(host, RESET)) { in ufs_intel_device_reset()
316 err = intel_dsm(host, hba->dev, INTEL_DSM_RESET, &result); in ufs_intel_device_reset()
318 err = -EIO; in ufs_intel_device_reset()
320 dev_err(hba->dev, "%s: DSM error %d result %u\n", in ufs_intel_device_reset()
325 if (!host->reset_gpio) in ufs_intel_device_reset()
326 return -EOPNOTSUPP; in ufs_intel_device_reset()
328 gpiod_set_value_cansleep(host->reset_gpio, 1); in ufs_intel_device_reset()
331 gpiod_set_value_cansleep(host->reset_gpio, 0); in ufs_intel_device_reset()
340 return devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in ufs_intel_get_reset_gpio()
347 hba->caps |= UFSHCD_CAP_RPM_AUTOSUSPEND; in ufs_intel_common_init()
349 host = devm_kzalloc(hba->dev, sizeof(*host), GFP_KERNEL); in ufs_intel_common_init()
351 return -ENOMEM; in ufs_intel_common_init()
353 intel_dsm_init(host, hba->dev); in ufs_intel_common_init()
354 if (INTEL_DSM_SUPPORTED(host, RESET)) { in ufs_intel_common_init()
355 if (hba->vops->device_reset) in ufs_intel_common_init()
356 hba->caps |= UFSHCD_CAP_DEEPSLEEP; in ufs_intel_common_init()
358 if (hba->vops->device_reset) in ufs_intel_common_init()
359 host->reset_gpio = ufs_intel_get_reset_gpio(hba->dev); in ufs_intel_common_init()
360 if (IS_ERR(host->reset_gpio)) { in ufs_intel_common_init()
361 dev_err(hba->dev, "%s: failed to get reset GPIO, error %ld\n", in ufs_intel_common_init()
362 __func__, PTR_ERR(host->reset_gpio)); in ufs_intel_common_init()
363 host->reset_gpio = NULL; in ufs_intel_common_init()
365 if (host->reset_gpio) { in ufs_intel_common_init()
366 gpiod_set_value_cansleep(host->reset_gpio, 0); in ufs_intel_common_init()
367 hba->caps |= UFSHCD_CAP_DEEPSLEEP; in ufs_intel_common_init()
370 intel_ltr_expose(hba->dev); in ufs_intel_common_init()
378 intel_ltr_hide(hba->dev); in ufs_intel_common_exit()
389 dev_err(hba->dev, "%s: hibern8 exit failed %d\n", in ufs_intel_resume()
392 * Force reset and restore. Any other actions can lead in ufs_intel_resume()
404 hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8; in ufs_intel_ehl_init()
410 /* LKF always needs a full reset, so set PM accordingly */ in ufs_intel_lkf_late_init()
411 if (hba->caps & UFSHCD_CAP_DEEPSLEEP) { in ufs_intel_lkf_late_init()
412 hba->spm_lvl = UFS_PM_LVL_6; in ufs_intel_lkf_late_init()
413 hba->rpm_lvl = UFS_PM_LVL_6; in ufs_intel_lkf_late_init()
415 hba->spm_lvl = UFS_PM_LVL_5; in ufs_intel_lkf_late_init()
416 hba->rpm_lvl = UFS_PM_LVL_5; in ufs_intel_lkf_late_init()
425 hba->nop_out_timeout = 200; in ufs_intel_lkf_init()
426 hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8; in ufs_intel_lkf_init()
427 hba->caps |= UFSHCD_CAP_CRYPTO; in ufs_intel_lkf_init()
430 ufs_host->late_init = ufs_intel_lkf_late_init; in ufs_intel_lkf_init()
436 hba->nop_out_timeout = 200; in ufs_intel_adl_init()
437 hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8; in ufs_intel_adl_init()
438 hba->caps |= UFSHCD_CAP_WB_EN; in ufs_intel_adl_init()
444 hba->caps |= UFSHCD_CAP_CRYPTO | UFSHCD_CAP_WB_EN; in ufs_intel_mtl_init()
449 .name = "intel-pci",
453 .resume = ufs_intel_resume,
457 .name = "intel-pci",
461 .resume = ufs_intel_resume,
465 .name = "intel-pci",
472 .resume = ufs_intel_resume,
477 .name = "intel-pci",
481 .resume = ufs_intel_resume,
486 .name = "intel-pci",
491 .resume = ufs_intel_resume,
500 /* Force a full reset and restore */ in ufshcd_pci_restore()
508 * ufshcd_pci_remove - de-allocate PCI/SCSI host and host memory space
516 pm_runtime_forbid(&pdev->dev); in ufshcd_pci_remove()
517 pm_runtime_get_noresume(&pdev->dev); in ufshcd_pci_remove()
523 * ufshcd_pci_probe - probe routine of the driver
527 * Return: 0 on success, non-zero value on failure.
539 dev_err(&pdev->dev, "pcim_enable_device failed\n"); in ufshcd_pci_probe()
547 dev_err(&pdev->dev, "request and iomap failed\n"); in ufshcd_pci_probe()
553 err = ufshcd_alloc_host(&pdev->dev, &hba); in ufshcd_pci_probe()
555 dev_err(&pdev->dev, "Allocation failed\n"); in ufshcd_pci_probe()
559 hba->vops = (struct ufs_hba_variant_ops *)id->driver_data; in ufshcd_pci_probe()
561 err = ufshcd_init(hba, mmio_base, pdev->irq); in ufshcd_pci_probe()
563 dev_err(&pdev->dev, "Initialization failed\n"); in ufshcd_pci_probe()
569 if (ufs_host && ufs_host->late_init) in ufshcd_pci_probe()
570 ufs_host->late_init(hba); in ufshcd_pci_probe()
572 pm_runtime_put_noidle(&pdev->dev); in ufshcd_pci_probe()
573 pm_runtime_allow(&pdev->dev); in ufshcd_pci_probe()
582 .resume = ufshcd_system_resume,