summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/tegra_bbc_proxy.c
diff options
context:
space:
mode:
authorVinayak Pane <vpane@nvidia.com>2013-05-08 17:48:26 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 13:14:56 -0700
commit003ad6ba1bcfb8152615fedb20119abb22f8b638 (patch)
tree5570aa06aad3c470f0f8cd20b67ce0446a31df0e /arch/arm/mach-tegra/tegra_bbc_proxy.c
parentf93ab38bba18e8b58cb52df559d9ab8c4326f269 (diff)
ARM: tegra: bbc: provide api to save and restore iso
The ISO request from BBC must be cleared when BBC is hibernated. And the ISO bandwidth should be restored back when BBC wakes up. Adding APIs in bbc proxy driver to support above need to be controlled from bb power driver. Bug 1284833 Change-Id: I8313bb1fd529a2f5a0c6f32bac5a5e51bf78509b Signed-off-by: Vinayak Pane <vpane@nvidia.com> Reviewed-on: http://git-master/r/226866 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Stephane Dion <sdion@nvidia.com> Reviewed-by: Steve Lin <stlin@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/tegra_bbc_proxy.c')
-rw-r--r--arch/arm/mach-tegra/tegra_bbc_proxy.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/tegra_bbc_proxy.c b/arch/arm/mach-tegra/tegra_bbc_proxy.c
index 053f9d2a4204..0aee23c92317 100644
--- a/arch/arm/mach-tegra/tegra_bbc_proxy.c
+++ b/arch/arm/mach-tegra/tegra_bbc_proxy.c
@@ -44,6 +44,9 @@ struct tegra_bbc_proxy {
unsigned int i_thresh_lte_adjperiod; /* lte i_thresh adj period */
unsigned int threshold; /* current edp threshold value */
unsigned int state; /* current edp state value */
+ /* last iso settings with proxy driver */
+ unsigned int last_bw;
+ unsigned int last_ult;
struct work_struct edp_work;
struct mutex edp_lock; /* lock for edp operations */
@@ -389,6 +392,9 @@ static ssize_t iso_reserve_store(struct device *dev,
if (!ret)
dev_err(dev, "can't reserve iso bw\n");
+ bbc->last_bw = bw;
+ bbc->last_ult = ult;
+
tegra_set_latency_allowance(TEGRA_LA_BBCR, bw / 1000);
tegra_set_latency_allowance(TEGRA_LA_BBCW, bw / 1000);
@@ -460,6 +466,9 @@ int tegra_bbc_proxy_bw_request(struct device *dev, u32 mode, u32 bw, u32 lt,
struct tegra_bbc_proxy *bbc = dev_get_drvdata(dev);
mutex_lock(&bbc->iso_lock);
+ bbc->last_bw = bw;
+ bbc->last_ult = lt;
+
ret = bbc_bw_request_unlocked(dev, mode, bw, lt, margin);
mutex_unlock(&bbc->iso_lock);
@@ -467,6 +476,40 @@ int tegra_bbc_proxy_bw_request(struct device *dev, u32 mode, u32 bw, u32 lt,
}
EXPORT_SYMBOL(tegra_bbc_proxy_bw_request);
+int tegra_bbc_proxy_restore_iso(struct device *dev)
+{
+ int ret;
+ struct tegra_bbc_proxy *bbc = dev_get_drvdata(dev);
+
+ if (!bbc)
+ return -EINVAL;
+
+ mutex_lock(&bbc->iso_lock);
+ ret = bbc_bw_request_unlocked(dev, 0, bbc->last_bw,
+ bbc->last_ult, bbc->margin);
+ mutex_unlock(&bbc->iso_lock);
+
+ return 0;
+}
+EXPORT_SYMBOL(tegra_bbc_proxy_restore_iso);
+
+int tegra_bbc_proxy_clear_iso(struct device *dev)
+{
+ int ret;
+ struct tegra_bbc_proxy *bbc = dev_get_drvdata(dev);
+
+ if (!bbc)
+ return -EINVAL;
+
+ mutex_lock(&bbc->iso_lock);
+ ret = bbc_bw_request_unlocked(dev, 0, 0,
+ 1000, bbc->margin);
+ mutex_unlock(&bbc->iso_lock);
+
+ return 0;
+}
+EXPORT_SYMBOL(tegra_bbc_proxy_clear_iso);
+
static ssize_t iso_res_realize_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t size)
{
@@ -499,6 +542,9 @@ static ssize_t iso_res_realize_store(struct device *dev,
}
mutex_lock(&bbc->iso_lock);
+ bbc->last_bw = bw;
+ bbc->last_ult = ult;
+
ret = bbc_bw_request_unlocked(dev, 0, bw, ult, bbc->margin);
mutex_unlock(&bbc->iso_lock);