aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/mmc/host.h
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@stericsson.com>2010-11-08 21:36:50 -0500
committerChris Ball <cjb@laptop.org>2011-01-08 22:48:03 -0500
commit04566831a703ae3ef4b49a2deae261c9ed26e020 (patch)
tree5dbf02cc4733de2959b5d40f848a74b758804c61 /include/linux/mmc/host.h
parent26daa1ed40c6b31b4220581431982814c47c608a (diff)
mmc: Aggressive clock gating framework
This patch modifies the MMC core code to optionally call the set_ios() operation on the driver with the clock frequency set to 0 (gate) after a grace period of at least 8 MCLK cycles, then restore it (ungate) before any new request. This gives the driver the option to shut down the MCI clock to the MMC/SD card when the clock frequency is 0, i.e. the core has stated that the MCI clock does not need to be generated. It is inspired by existing clock gating code found in the OMAP and Atmel drivers and brings this up to the host abstraction. Gating is performed before and after any MMC request. This patchset implements this for the MMCI/PL180 MMC/SD host controller, but it should be simple to switch OMAP/Atmel over to using this instead. mmc_set_{gated,ungated}() add variable protection to the state holders for the clock gating code. This is particularly important when ordinary .set_ios() calls would race with the .set_ios() call resulting from a delayed gate operation. Signed-off-by: Linus Walleij <linus.walleij@stericsson.com> Reviewed-by: Chris Ball <cjb@laptop.org> Tested-by: Chris Ball <cjb@laptop.org> Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'include/linux/mmc/host.h')
-rw-r--r--include/linux/mmc/host.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 30f6fad99a58..381c77fd4dca 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -172,6 +172,16 @@ struct mmc_host {
172 172
173 mmc_pm_flag_t pm_caps; /* supported pm features */ 173 mmc_pm_flag_t pm_caps; /* supported pm features */
174 174
175#ifdef CONFIG_MMC_CLKGATE
176 int clk_requests; /* internal reference counter */
177 unsigned int clk_delay; /* number of MCI clk hold cycles */
178 bool clk_gated; /* clock gated */
179 struct work_struct clk_gate_work; /* delayed clock gate */
180 unsigned int clk_old; /* old clock value cache */
181 spinlock_t clk_lock; /* lock for clk fields */
182 struct mutex clk_gate_mutex; /* mutex for clock gating */
183#endif
184
175 /* host specific block data */ 185 /* host specific block data */
176 unsigned int max_seg_size; /* see blk_queue_max_segment_size */ 186 unsigned int max_seg_size; /* see blk_queue_max_segment_size */
177 unsigned short max_segs; /* see blk_queue_max_segments */ 187 unsigned short max_segs; /* see blk_queue_max_segments */