Nishanth Menon n...@ti.com writes:
From: Jarkko Nikula jhnik...@gmail.com
sr_start_vddautocomp and sr_stop_autocomp functions can be reused from
omap_sr_enable, omap_sr_disable and omap_sr_disable_reset_volt and by
adding one additional argument sr_stop_autocomp. This allows us to have
a single point where SR enable and disable operations are controlled from.
[n...@ti.com: synced it up with class start/stop as well. autocomp flag
should only be disabled when SR is disabled for that domain]
Signed-off-by: Nishanth Menon n...@ti.com
Signed-off-by: Jarkko Nikula jhnik...@gmail.com
---
Side note: Jarkko has'nt seen this rev as I just finished the rebase and
tested
but adding his signed-off anyways as he is primary contributor to the idea
and the patch.
This one looks fine, but will wait to apply it since it depends on the
previous one which needs some minor fixups.
Kevin
arch/arm/mach-omap2/smartreflex.c | 66
+
1 files changed, 23 insertions(+), 43 deletions(-)
diff --git a/arch/arm/mach-omap2/smartreflex.c
b/arch/arm/mach-omap2/smartreflex.c
index 592e9a0..d839fa6 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -211,8 +211,12 @@ static void sr_set_regfields(struct omap_sr *sr)
}
}
-static void sr_start_vddautocomp(struct omap_sr *sr)
+static void sr_start_vddautocomp(struct omap_sr *sr, bool class_start)
{
+ int r;
+ if (sr-autocomp_active)
+ return;
+
if (!sr_class || !(sr_class-enable) || !(sr_class-configure)) {
dev_warn(sr-pdev-dev,
%s: smartreflex class driver not registered\n,
@@ -220,19 +224,24 @@ static void sr_start_vddautocomp(struct omap_sr *sr)
return;
}
- if (sr_class-start
+ if (class_start sr_class-start
sr_class-start(sr-voltdm, sr_class-class_priv_data)) {
dev_err(sr-pdev-dev,
%s: SRClass initialization failed\n, __func__);
return;
}
- if (!sr_class-enable(sr-voltdm))
+ r = sr_class-enable(sr-voltdm);
+ if (!r class_start)
sr-autocomp_active = true;
}
-static void sr_stop_vddautocomp(struct omap_sr *sr)
+static void sr_stop_vddautocomp(struct omap_sr *sr, bool class_stop,
+ int is_volt_reset)
{
+ if (!sr-autocomp_active)
+ return;
+
if (!sr_class || !(sr_class-disable)) {
dev_warn(sr-pdev-dev,
%s: smartreflex class driver not registered\n,
@@ -240,15 +249,13 @@ static void sr_stop_vddautocomp(struct omap_sr *sr)
return;
}
- if (sr-autocomp_active) {
- sr_class-disable(sr-voltdm, 1);
+ sr_class-disable(sr-voltdm, is_volt_reset);
+ if (class_stop) {
if (sr_class-stop
- sr_class-stop(sr-voltdm,
- sr_class-class_priv_data)) {
+ sr_class-stop(sr-voltdm, sr_class-class_priv_data))
dev_err(sr-pdev-dev,
%s: SR[%d]Class deinitialization failed\n,
__func__, sr-srid);
- }
sr-autocomp_active = false;
}
}
@@ -285,7 +292,7 @@ static int sr_late_init(struct omap_sr *sr_info)
}
if (pdata pdata-enable_on_init)
- sr_start_vddautocomp(sr_info);
+ sr_start_vddautocomp(sr_info, true);
return ret;
@@ -693,16 +700,7 @@ void omap_sr_enable(struct voltagedomain *voltdm)
return;
}
- if (!sr-autocomp_active)
- return;
-
- if (!sr_class || !(sr_class-enable) || !(sr_class-configure)) {
- dev_warn(sr-pdev-dev, %s: smartreflex class driver not
- registered\n, __func__);
- return;
- }
-
- sr_class-enable(voltdm);
+ sr_start_vddautocomp(sr, false);
}
/**
@@ -726,16 +724,7 @@ void omap_sr_disable(struct voltagedomain *voltdm)
return;
}
- if (!sr-autocomp_active)
- return;
-
- if (!sr_class || !(sr_class-disable)) {
- dev_warn(sr-pdev-dev, %s: smartreflex class driver not
- registered\n, __func__);
- return;
- }
-
- sr_class-disable(voltdm, 0);
+ sr_stop_vddautocomp(sr, false, 0);
}
/**
@@ -759,16 +748,7 @@ void omap_sr_disable_reset_volt(struct voltagedomain
*voltdm)
return;
}
- if (!sr-autocomp_active)
- return;
-
- if (!sr_class || !(sr_class-disable)) {
- dev_warn(sr-pdev-dev, %s: smartreflex class driver not
- registered\n, __func__);
- return;
- }
-
- sr_class-disable(voltdm, 1);
+ sr_stop_vddautocomp(sr, false, 1);
}
/**
@@ -823,9