Loading drivers/scsi/ufs/ufshcd.c +61 −15 Original line number Diff line number Diff line Loading @@ -485,6 +485,39 @@ static struct devfreq_dev_profile ufs_devfreq_profile = { .get_dev_status = ufshcd_devfreq_get_dev_status, }; static int ufshcd_devfreq_init(struct ufs_hba *hba) { struct list_head *clk_list = &hba->clk_list_head; struct ufs_clk_info *clki; struct devfreq *devfreq; int ret; /* Skip devfreq if we don't have any clocks in the list */ if (list_empty(clk_list)) return 0; clki = list_first_entry(clk_list, struct ufs_clk_info, list); dev_pm_opp_add(hba->dev, clki->min_freq, 0); dev_pm_opp_add(hba->dev, clki->max_freq, 0); devfreq = devfreq_add_device(hba->dev, &ufs_devfreq_profile, "simple_ondemand", gov_data); if (IS_ERR(devfreq)) { ret = PTR_ERR(devfreq); dev_err(hba->dev, "Unable to register with devfreq %d\n", ret); dev_pm_opp_remove(hba->dev, clki->min_freq); dev_pm_opp_remove(hba->dev, clki->max_freq); return ret; } hba->devfreq = devfreq; return 0; } static inline bool ufshcd_valid_tag(struct ufs_hba *hba, int tag) { return tag >= 0 && tag < hba->nutrs; Loading Loading @@ -1854,16 +1887,13 @@ static int ufshcd_devfreq_target(struct device *dev, struct ufs_hba *hba = dev_get_drvdata(dev); ktime_t start; bool scale_up, sched_clk_scaling_suspend_work = false; struct list_head *clk_list = &hba->clk_list_head; struct ufs_clk_info *clki; unsigned long irq_flags; if (!ufshcd_is_clkscaling_supported(hba)) return -EINVAL; if ((*freq > 0) && (*freq < UINT_MAX)) { dev_err(hba->dev, "%s: invalid freq = %lu\n", __func__, *freq); return -EINVAL; } spin_lock_irqsave(hba->host->host_lock, irq_flags); if (ufshcd_eh_in_progress(hba)) { spin_unlock_irqrestore(hba->host->host_lock, irq_flags); Loading @@ -1873,7 +1903,13 @@ static int ufshcd_devfreq_target(struct device *dev, if (!hba->clk_scaling.active_reqs) sched_clk_scaling_suspend_work = true; scale_up = (*freq == UINT_MAX) ? true : false; if (list_empty(clk_list)) { spin_unlock_irqrestore(hba->host->host_lock, irq_flags); goto out; } clki = list_first_entry(&hba->clk_list_head, struct ufs_clk_info, list); scale_up = (*freq == clki->max_freq) ? true : false; if (!ufshcd_is_devfreq_scaling_required(hba, scale_up)) { spin_unlock_irqrestore(hba->host->host_lock, irq_flags); ret = 0; Loading Loading @@ -1934,6 +1970,22 @@ static int ufshcd_devfreq_get_dev_status(struct device *dev, return 0; } static void ufshcd_devfreq_remove(struct ufs_hba *hba) { struct list_head *clk_list = &hba->clk_list_head; struct ufs_clk_info *clki; if (!hba->devfreq) return; devfreq_remove_device(hba->devfreq); hba->devfreq = NULL; clki = list_first_entry(clk_list, struct ufs_clk_info, list); dev_pm_opp_remove(hba->dev, clki->min_freq); dev_pm_opp_remove(hba->dev, clki->max_freq); } static void __ufshcd_suspend_clkscaling(struct ufs_hba *hba) { unsigned long flags; Loading Loading @@ -8642,17 +8694,10 @@ static int ufshcd_probe_hba(struct ufs_hba *hba) hba->clk_scaling.saved_pwr_info.is_valid = true; hba->clk_scaling.is_scaled_up = true; if (!hba->devfreq) { hba->devfreq = devm_devfreq_add_device(hba->dev, &ufs_devfreq_profile, "simple_ondemand", gov_data); if (IS_ERR(hba->devfreq)) { ret = PTR_ERR(hba->devfreq); dev_err(hba->dev, "Unable to register with devfreq %d\n", ret); ret = ufshcd_devfreq_init(hba); if (ret) goto out; } } hba->clk_scaling.is_allowed = true; } Loading Loading @@ -9616,6 +9661,7 @@ static void ufshcd_hba_exit(struct ufs_hba *hba) ufshcd_suspend_clkscaling(hba); if (hba->clk_scaling.workq) destroy_workqueue(hba->clk_scaling.workq); ufshcd_devfreq_remove(hba); } ufshcd_disable_clocks(hba, false); ufshcd_setup_hba_vreg(hba, false); Loading Loading
drivers/scsi/ufs/ufshcd.c +61 −15 Original line number Diff line number Diff line Loading @@ -485,6 +485,39 @@ static struct devfreq_dev_profile ufs_devfreq_profile = { .get_dev_status = ufshcd_devfreq_get_dev_status, }; static int ufshcd_devfreq_init(struct ufs_hba *hba) { struct list_head *clk_list = &hba->clk_list_head; struct ufs_clk_info *clki; struct devfreq *devfreq; int ret; /* Skip devfreq if we don't have any clocks in the list */ if (list_empty(clk_list)) return 0; clki = list_first_entry(clk_list, struct ufs_clk_info, list); dev_pm_opp_add(hba->dev, clki->min_freq, 0); dev_pm_opp_add(hba->dev, clki->max_freq, 0); devfreq = devfreq_add_device(hba->dev, &ufs_devfreq_profile, "simple_ondemand", gov_data); if (IS_ERR(devfreq)) { ret = PTR_ERR(devfreq); dev_err(hba->dev, "Unable to register with devfreq %d\n", ret); dev_pm_opp_remove(hba->dev, clki->min_freq); dev_pm_opp_remove(hba->dev, clki->max_freq); return ret; } hba->devfreq = devfreq; return 0; } static inline bool ufshcd_valid_tag(struct ufs_hba *hba, int tag) { return tag >= 0 && tag < hba->nutrs; Loading Loading @@ -1854,16 +1887,13 @@ static int ufshcd_devfreq_target(struct device *dev, struct ufs_hba *hba = dev_get_drvdata(dev); ktime_t start; bool scale_up, sched_clk_scaling_suspend_work = false; struct list_head *clk_list = &hba->clk_list_head; struct ufs_clk_info *clki; unsigned long irq_flags; if (!ufshcd_is_clkscaling_supported(hba)) return -EINVAL; if ((*freq > 0) && (*freq < UINT_MAX)) { dev_err(hba->dev, "%s: invalid freq = %lu\n", __func__, *freq); return -EINVAL; } spin_lock_irqsave(hba->host->host_lock, irq_flags); if (ufshcd_eh_in_progress(hba)) { spin_unlock_irqrestore(hba->host->host_lock, irq_flags); Loading @@ -1873,7 +1903,13 @@ static int ufshcd_devfreq_target(struct device *dev, if (!hba->clk_scaling.active_reqs) sched_clk_scaling_suspend_work = true; scale_up = (*freq == UINT_MAX) ? true : false; if (list_empty(clk_list)) { spin_unlock_irqrestore(hba->host->host_lock, irq_flags); goto out; } clki = list_first_entry(&hba->clk_list_head, struct ufs_clk_info, list); scale_up = (*freq == clki->max_freq) ? true : false; if (!ufshcd_is_devfreq_scaling_required(hba, scale_up)) { spin_unlock_irqrestore(hba->host->host_lock, irq_flags); ret = 0; Loading Loading @@ -1934,6 +1970,22 @@ static int ufshcd_devfreq_get_dev_status(struct device *dev, return 0; } static void ufshcd_devfreq_remove(struct ufs_hba *hba) { struct list_head *clk_list = &hba->clk_list_head; struct ufs_clk_info *clki; if (!hba->devfreq) return; devfreq_remove_device(hba->devfreq); hba->devfreq = NULL; clki = list_first_entry(clk_list, struct ufs_clk_info, list); dev_pm_opp_remove(hba->dev, clki->min_freq); dev_pm_opp_remove(hba->dev, clki->max_freq); } static void __ufshcd_suspend_clkscaling(struct ufs_hba *hba) { unsigned long flags; Loading Loading @@ -8642,17 +8694,10 @@ static int ufshcd_probe_hba(struct ufs_hba *hba) hba->clk_scaling.saved_pwr_info.is_valid = true; hba->clk_scaling.is_scaled_up = true; if (!hba->devfreq) { hba->devfreq = devm_devfreq_add_device(hba->dev, &ufs_devfreq_profile, "simple_ondemand", gov_data); if (IS_ERR(hba->devfreq)) { ret = PTR_ERR(hba->devfreq); dev_err(hba->dev, "Unable to register with devfreq %d\n", ret); ret = ufshcd_devfreq_init(hba); if (ret) goto out; } } hba->clk_scaling.is_allowed = true; } Loading Loading @@ -9616,6 +9661,7 @@ static void ufshcd_hba_exit(struct ufs_hba *hba) ufshcd_suspend_clkscaling(hba); if (hba->clk_scaling.workq) destroy_workqueue(hba->clk_scaling.workq); ufshcd_devfreq_remove(hba); } ufshcd_disable_clocks(hba, false); ufshcd_setup_hba_vreg(hba, false); Loading