linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: ccross@android.com (Colin Cross)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 19/21] ARM: tegra: clock: Add function to set SDMMC tap delay
Date: Sat, 19 Feb 2011 14:26:08 -0800	[thread overview]
Message-ID: <1298154371-5641-21-git-send-email-ccross@android.com> (raw)
In-Reply-To: <1298154371-5641-1-git-send-email-ccross@android.com>

The SDMMC controllers have extra bits in the clock source
register that adjust the delay between the clock and data
to compenstate for delays on the PCB.  The values need to
be set from the clock code so the clock can be locked
during the read-modify-write on the clock source register.

Signed-off-by: Colin Cross <ccross@android.com>
---
 arch/arm/mach-tegra/clock.c            |   12 ++++++++++++
 arch/arm/mach-tegra/clock.h            |    1 +
 arch/arm/mach-tegra/include/mach/clk.h |    2 ++
 arch/arm/mach-tegra/tegra2_clocks.c    |   19 +++++++++++++++++++
 4 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-tegra/clock.c b/arch/arm/mach-tegra/clock.c
index 9798585..0df6206 100644
--- a/arch/arm/mach-tegra/clock.c
+++ b/arch/arm/mach-tegra/clock.c
@@ -433,6 +433,18 @@ int __init tegra_disable_boot_clocks(void)
 late_initcall(tegra_disable_boot_clocks);
 #endif
 
+/* The SDMMC controllers have extra bits in the clock source register that
+ * adjust the delay between the clock and data to compenstate for delays
+ * on the PCB. */
+void tegra_sdmmc_tap_delay(struct clk *c, int delay)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&c->spinlock, flags);
+	tegra2_sdmmc_tap_delay(c, delay);
+	spin_unlock_irqrestore(&c->spinlock, flags);
+}
+
 #ifdef CONFIG_DEBUG_FS
 
 static int __clk_lock_all_spinlocks(void)
diff --git a/arch/arm/mach-tegra/clock.h b/arch/arm/mach-tegra/clock.h
index ebe6ea8..688316a 100644
--- a/arch/arm/mach-tegra/clock.h
+++ b/arch/arm/mach-tegra/clock.h
@@ -155,5 +155,6 @@ int clk_reparent(struct clk *c, struct clk *parent);
 void tegra_clk_init_from_table(struct tegra_clk_init_table *table);
 unsigned long clk_get_rate_locked(struct clk *c);
 int clk_set_rate_locked(struct clk *c, unsigned long rate);
+void tegra2_sdmmc_tap_delay(struct clk *c, int delay);
 
 #endif
diff --git a/arch/arm/mach-tegra/include/mach/clk.h b/arch/arm/mach-tegra/include/mach/clk.h
index fa7f9ca..c8baf8f 100644
--- a/arch/arm/mach-tegra/include/mach/clk.h
+++ b/arch/arm/mach-tegra/include/mach/clk.h
@@ -26,4 +26,6 @@ void tegra_periph_reset_deassert(struct clk *c);
 void tegra_periph_reset_assert(struct clk *c);
 
 unsigned long clk_get_rate_all_locked(struct clk *c);
+void tegra_sdmmc_tap_delay(struct clk *c, int delay);
+
 #endif
diff --git a/arch/arm/mach-tegra/tegra2_clocks.c b/arch/arm/mach-tegra/tegra2_clocks.c
index 395d006..cc2616c 100644
--- a/arch/arm/mach-tegra/tegra2_clocks.c
+++ b/arch/arm/mach-tegra/tegra2_clocks.c
@@ -74,6 +74,10 @@
 #define PERIPH_CLK_SOURCE_DIVU16_MASK	0xFFFF
 #define PERIPH_CLK_SOURCE_DIV_SHIFT	0
 
+#define SDMMC_CLK_INT_FB_SEL		(1 << 23)
+#define SDMMC_CLK_INT_FB_DLY_SHIFT	16
+#define SDMMC_CLK_INT_FB_DLY_MASK	(0xF << SDMMC_CLK_INT_FB_DLY_SHIFT)
+
 #define PLL_BASE			0x0
 #define PLL_BASE_BYPASS			(1<<31)
 #define PLL_BASE_ENABLE			(1<<30)
@@ -1079,6 +1083,21 @@ static struct clk_ops tegra_periph_clk_ops = {
 	.reset			= &tegra2_periph_clk_reset,
 };
 
+/* The SDMMC controllers have extra bits in the clock source register that
+ * adjust the delay between the clock and data to compenstate for delays
+ * on the PCB. */
+void tegra2_sdmmc_tap_delay(struct clk *c, int delay)
+{
+	u32 reg;
+
+	delay = clamp(delay, 0, 15);
+	reg = clk_readl(c->reg);
+	reg &= ~SDMMC_CLK_INT_FB_DLY_MASK;
+	reg |= SDMMC_CLK_INT_FB_SEL;
+	reg |= delay << SDMMC_CLK_INT_FB_DLY_SHIFT;
+	clk_writel(reg, c->reg);
+}
+
 /* External memory controller clock ops */
 static void tegra2_emc_clk_init(struct clk *c)
 {
-- 
1.7.3.1

  parent reply	other threads:[~2011-02-19 22:26 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-19 22:25 [PATCH v2 12/21] ARM: tegra: clock: Add shared bus clock type Colin Cross
2011-02-19 22:25 ` [PATCH v2 00/21] Tegra clock updates for 2.6.39 Colin Cross
2011-02-19 22:25 ` [PATCH v2 01/21] ARM: tegra: clock: enable clk reset for non-peripheral clocks Colin Cross
2011-02-21  4:05   ` Olof Johansson
2011-02-19 22:25 ` [PATCH v2 02/21] ARM: tegra: clock: Don't BUG on changing an enabled PLL Colin Cross
2011-02-21  4:06   ` Olof Johansson
2011-02-21  6:46     ` Colin Cross
2011-02-19 22:25 ` [PATCH v2 03/21] ARM: tegra: clock: Drop debugging Colin Cross
2011-02-21  4:07   ` Olof Johansson
2011-02-21  6:56     ` Colin Cross
2011-02-19 22:25 ` [PATCH v2 04/21] ARM: tegra: clock: Don't use PLL lock bits Colin Cross
2011-02-21  4:07   ` Olof Johansson
2011-02-19 22:25 ` [PATCH v2 05/21] ARM: tegra: clock: Disable clocks left on by bootloader Colin Cross
2011-02-21  0:40   ` Olof Johansson
2011-02-21  3:43     ` Colin Cross
2011-02-21  4:03       ` Olof Johansson
2011-02-19 22:25 ` [PATCH v2 06/21] ARM: tegra: clock: Initialize clocks that have no enable Colin Cross
2011-02-21  4:08   ` Olof Johansson
2011-02-19 22:25 ` [PATCH v2 07/21] ARM: tegra: clock: Drop CPU dvfs Colin Cross
2011-02-21  4:09   ` Olof Johansson
2011-02-19 22:25 ` [PATCH v2 08/21] ARM: tegra: clock: Rearrange static clock tables Colin Cross
2011-02-21  4:09   ` Olof Johansson
2011-02-19 22:25 ` [PATCH v2 09/21] ARM: tegra: clock: Move unshared clk struct members into union Colin Cross
2011-02-21  4:10   ` Olof Johansson
2011-02-21  7:00     ` Colin Cross
2011-02-19 22:25 ` [PATCH v2 10/21] ARM: tegra: clock: Convert global lock to a lock per clock Colin Cross
2011-02-21  4:11   ` Olof Johansson
2011-02-19 22:26 ` [PATCH v2 11/21] ARM: tegra: cpufreq: Take an extra reference to pllx Colin Cross
2011-02-21  4:12   ` Olof Johansson
2011-02-19 22:26 ` [PATCH v2 12/21] ARM: tegra: clock: Add shared bus clock type Colin Cross
2011-02-19 22:26 ` [PATCH v2 13/21] ARM: tegra: clock: Remove unnecessary uses of #ifdef CONFIG_DEBUG_FS Colin Cross
2011-02-21  4:17   ` Olof Johansson
2011-02-19 22:26 ` [PATCH v2 14/21] ARM: tegra: clock: Refcount periph clock enables Colin Cross
2011-02-21  4:18   ` Olof Johansson
2011-02-21  7:06     ` Colin Cross
2011-02-19 22:26 ` [PATCH v2 15/21] ARM: tegra: clock: Round rate before setting rate Colin Cross
2011-02-21  4:19   ` Olof Johansson
2011-02-21  7:52     ` Colin Cross
2011-02-19 22:26 ` [PATCH v2 16/21] ARM: tegra: Add external memory controller driver Colin Cross
2011-02-21  4:20   ` Olof Johansson
2011-02-19 22:26 ` [PATCH v2 17/21] ARM: tegra: clocks: Add emc scaling Colin Cross
2011-02-21  4:21   ` Olof Johansson
2011-02-19 22:26 ` [PATCH v2 18/21] ARM: tegra: cpufreq: Adjust memory frequency with cpu frequency Colin Cross
2011-02-21  4:23   ` Olof Johansson
2011-02-19 22:26 ` Colin Cross [this message]
2011-02-21  4:26   ` [PATCH v2 19/21] ARM: tegra: clock: Add function to set SDMMC tap delay Olof Johansson
2011-02-19 22:26 ` [PATCH v2 20/21] ARM: tegra: clock: Fix clock issues in suspend Colin Cross
2011-02-21  4:28   ` Olof Johansson
2011-02-19 22:26 ` [PATCH v2 21/21] ARM: tegra: clock: Miscellaneous clock updates Colin Cross
2011-02-21  4:28   ` Olof Johansson
2011-02-21  4:15 ` [PATCH v2 12/21] ARM: tegra: clock: Add shared bus clock type Olof Johansson
2011-02-21  7:02   ` Colin Cross

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=1298154371-5641-21-git-send-email-ccross@android.com \
    --to=ccross@android.com \
    --cc=linux-arm-kernel@lists.infradead.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).