From: Tero Kristo <t-kristo@ti.com>
To: linux-omap@vger.kernel.org, khilman@ti.com
Cc: linux-arm-kernel@lists.infradead.org
Subject: [PATCHv6 06/14] ARM: OMAP4: VC: calculate ramp times
Date: Thu, 31 May 2012 16:55:42 +0300 [thread overview]
Message-ID: <1338472550-20743-7-git-send-email-t-kristo@ti.com> (raw)
In-Reply-To: <1338472550-20743-1-git-send-email-t-kristo@ti.com>
OMAP4 VC code now uses voltage deltas + slew rates for calculating
actual ramp times for voltage changes. Both retention / sleep +
off mode voltage ramp times are setup at the same time during
initialization.
Signed-off-by: Tero Kristo <t-kristo@ti.com>
---
arch/arm/mach-omap2/vc.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 94 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
index bba0d7c..0a37673 100644
--- a/arch/arm/mach-omap2/vc.c
+++ b/arch/arm/mach-omap2/vc.c
@@ -310,12 +310,106 @@ static void __init omap3_vc_init_channel(struct voltagedomain *voltdm)
omap3_set_off_timings(voltdm);
}
+/**
+ * omap4_calc_volt_ramp - calculates voltage ramping delays on omap4
+ * @voltdm: channel to calculate values for
+ * @voltage_diff: voltage difference in microvolts
+ *
+ * Calculates voltage ramp prescaler + counter values for a voltage
+ * difference on omap4. Returns a field value suitable for writing to
+ * VOLTSETUP register for a channel in following format:
+ * bits[8:9] prescaler ... bits[0:5] counter. See OMAP4 TRM for reference.
+ */
+static u32 omap4_calc_volt_ramp(struct voltagedomain *voltdm, u32 voltage_diff)
+{
+ u32 prescaler;
+ u32 cycles;
+ u32 time;
+
+ time = voltage_diff / voltdm->pmic->slew_rate;
+
+ cycles = voltdm->sys_clk.rate / 1000 * time / 1000;
+
+ cycles /= 64;
+ prescaler = 0;
+
+ /* shift to next prescaler until no overflow */
+
+ /* scale for div 256 = 64 * 4 */
+ if (cycles > 63) {
+ cycles /= 4;
+ prescaler++;
+ }
+
+ /* scale for div 512 = 256 * 2 */
+ if (cycles > 63) {
+ cycles /= 2;
+ prescaler++;
+ }
+
+ /* scale for div 2048 = 512 * 4 */
+ if (cycles > 63) {
+ cycles /= 4;
+ prescaler++;
+ }
+
+ /* check for overflow => invalid ramp time */
+ if (cycles > 63) {
+ pr_warning("%s: invalid setuptime for vdd_%s\n", __func__,
+ voltdm->name);
+ return 0;
+ }
+
+ cycles++;
+
+ return (prescaler << OMAP4430_RAMP_UP_PRESCAL_SHIFT) |
+ (cycles << OMAP4430_RAMP_UP_COUNT_SHIFT);
+}
+
+/**
+ * omap4_set_timings - set voltage ramp timings for a channel
+ * @voltdm: channel to configure
+ * @off_mode: whether off-mode values are used
+ *
+ * Calculates and sets the voltage ramp up / down values for a channel.
+ */
+static void omap4_set_timings(struct voltagedomain *voltdm, bool off_mode)
+{
+ u32 val;
+ u32 ramp;
+ int offset;
+
+ if (off_mode) {
+ ramp = omap4_calc_volt_ramp(voltdm,
+ voltdm->vc_param->on - voltdm->vc_param->off);
+ offset = voltdm->vfsm->voltsetup_off_reg;
+ } else {
+ ramp = omap4_calc_volt_ramp(voltdm,
+ voltdm->vc_param->on - voltdm->vc_param->ret);
+ offset = voltdm->vfsm->voltsetup_reg;
+ }
+
+ if (!ramp)
+ return;
+
+ val = voltdm->read(offset);
+
+ val |= ramp << OMAP4430_RAMP_DOWN_COUNT_SHIFT;
+
+ val |= ramp << OMAP4430_RAMP_UP_COUNT_SHIFT;
+
+ voltdm->write(val, offset);
+}
+
/* OMAP4 specific voltage init functions */
static void __init omap4_vc_init_channel(struct voltagedomain *voltdm)
{
static bool is_initialized;
u32 vc_val;
+ omap4_set_timings(voltdm, true);
+ omap4_set_timings(voltdm, false);
+
if (is_initialized)
return;
--
1.7.4.1
next prev parent reply other threads:[~2012-05-31 13:56 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-31 13:55 [PATCHv6 00/14] ARM: OMAP3+: auto ret / auto off support Tero Kristo
2012-05-31 13:55 ` [PATCHv6 01/14] ARM: OMAP3+: PM: VP: use uV for max and min voltage limits Tero Kristo
2012-05-31 13:55 ` [PATCHv6 02/14] ARM: OMAP: voltage: renamed vp_vddmin and vp_vddmax fields Tero Kristo
2012-05-31 13:55 ` [PATCHv6 03/14] ARM: OMAP3+: voltage: introduce omap vc / vp params for voltagedomains Tero Kristo
2012-05-31 13:55 ` [PATCHv6 04/14] ARM: OMAP3: VC: calculate ramp times Tero Kristo
2012-05-31 13:55 ` [PATCHv6 05/14] ARM: OMAP4: voltage: add support for VOLTSETUP_x_OFF register Tero Kristo
2012-05-31 13:55 ` Tero Kristo [this message]
2012-05-31 13:55 ` [PATCHv6 07/14] ARM: OMAP: add support for oscillator setup Tero Kristo
2012-05-31 13:55 ` [PATCHv6 08/14] ARM: OMAP3+: vp: use new vp_params for calculating vddmin and vddmax Tero Kristo
2012-05-31 13:55 ` [PATCHv6 09/14] ARM: OMAP3+: voltage: use oscillator data to calculate setup times Tero Kristo
2012-05-31 13:55 ` [PATCHv6 10/14] ARM: OMAP: TWL: change the vddmin / vddmax voltages to spec Tero Kristo
2012-05-31 13:55 ` [PATCHv6 11/14] TEMP: ARM: OMAP3: beagle rev-c4: enable OPP6 Tero Kristo
2012-05-31 13:55 ` [PATCHv6 12/14] ARM: OMAP: beagle: set oscillator startup time to 10ms for rev c4 Tero Kristo
2012-05-31 13:55 ` [PATCHv6 13/14] ARM: OMAP3: vc: auto_ret / auto_off support Tero Kristo
2012-06-01 10:18 ` Menon, Nishanth
2012-05-31 13:55 ` [PATCHv6 14/14] ARM: OMAP3+: voltage: remove unused volt_setup_time parameter Tero Kristo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1338472550-20743-7-git-send-email-t-kristo@ti.com \
--to=t-kristo@ti.com \
--cc=khilman@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).