Commit a3cd5ec5 authored by subhashj@codeaurora.org's avatar subhashj@codeaurora.org Committed by Martin K. Petersen

scsi: ufs: add load based scaling of UFS gear

UFS driver's load based clock scaling feature scales down the ufs related
clocks in order to allow low power modes of chipsets. UniPro 1.6 supports
maximum gear up to HS-G3 (High Speed Gear3) and some of the chipsets
low power modes may not be allowed in HS-G3 hence this change adds support
to scale gear between HS-G3 and HS-G1 based on same existing load based
clock scaling logic.
Signed-off-by: default avatarSubhash Jadavani <subhashj@codeaurora.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 7fabb77b
This diff is collapsed.
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/rwsem.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
...@@ -351,6 +352,11 @@ struct ufs_clk_gating { ...@@ -351,6 +352,11 @@ struct ufs_clk_gating {
int active_reqs; int active_reqs;
}; };
struct ufs_saved_pwr_info {
struct ufs_pa_layer_attr info;
bool is_valid;
};
struct ufs_clk_scaling { struct ufs_clk_scaling {
ktime_t busy_start_t; ktime_t busy_start_t;
bool is_busy_started; bool is_busy_started;
...@@ -358,6 +364,7 @@ struct ufs_clk_scaling { ...@@ -358,6 +364,7 @@ struct ufs_clk_scaling {
unsigned long window_start_t; unsigned long window_start_t;
struct device_attribute enable_attr; struct device_attribute enable_attr;
bool is_allowed; bool is_allowed;
struct ufs_saved_pwr_info saved_pwr_info;
}; };
/** /**
...@@ -634,6 +641,8 @@ struct ufs_hba { ...@@ -634,6 +641,8 @@ struct ufs_hba {
enum bkops_status urgent_bkops_lvl; enum bkops_status urgent_bkops_lvl;
bool is_urgent_bkops_lvl_checked; bool is_urgent_bkops_lvl_checked;
struct rw_semaphore clk_scaling_lock;
}; };
/* Returns true if clocks can be gated. Otherwise false */ /* Returns true if clocks can be gated. Otherwise false */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment