aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/mmc/host.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/mmc/host.h')
-rw-r--r--include/linux/mmc/host.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 3e7615e9087e..eaf36364b7d4 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -11,6 +11,7 @@
11#define LINUX_MMC_HOST_H 11#define LINUX_MMC_HOST_H
12 12
13#include <linux/leds.h> 13#include <linux/leds.h>
14#include <linux/sched.h>
14 15
15#include <linux/mmc/core.h> 16#include <linux/mmc/core.h>
16 17
@@ -51,6 +52,35 @@ struct mmc_ios {
51}; 52};
52 53
53struct mmc_host_ops { 54struct mmc_host_ops {
55 /*
56 * Hosts that support power saving can use the 'enable' and 'disable'
57 * methods to exit and enter power saving states. 'enable' is called
58 * when the host is claimed and 'disable' is called (or scheduled with
59 * a delay) when the host is released. The 'disable' is scheduled if
60 * the disable delay set by 'mmc_set_disable_delay()' is non-zero,
61 * otherwise 'disable' is called immediately. 'disable' may be
62 * scheduled repeatedly, to permit ever greater power saving at the
63 * expense of ever greater latency to re-enable. Rescheduling is
64 * determined by the return value of the 'disable' method. A positive
65 * value gives the delay in milliseconds.
66 *
67 * In the case where a host function (like set_ios) may be called
68 * with or without the host claimed, enabling and disabling can be
69 * done directly and will nest correctly. Call 'mmc_host_enable()' and
70 * 'mmc_host_lazy_disable()' for this purpose, but note that these
71 * functions must be paired.
72 *
73 * Alternatively, 'mmc_host_enable()' may be paired with
74 * 'mmc_host_disable()' which calls 'disable' immediately. In this
75 * case the 'disable' method will be called with 'lazy' set to 0.
76 * This is mainly useful for error paths.
77 *
78 * Because lazy disable may be called from a work queue, the 'disable'
79 * method must claim the host when 'lazy' != 0, which will work
80 * correctly because recursion is detected and handled.
81 */
82 int (*enable)(struct mmc_host *host);
83 int (*disable)(struct mmc_host *host, int lazy);
54 void (*request)(struct mmc_host *host, struct mmc_request *req); 84 void (*request)(struct mmc_host *host, struct mmc_request *req);
55 /* 85 /*
56 * Avoid calling these three functions too often or in a "fast path", 86 * Avoid calling these three functions too often or in a "fast path",
@@ -118,6 +148,9 @@ struct mmc_host {
118#define MMC_CAP_SPI (1 << 4) /* Talks only SPI protocols */ 148#define MMC_CAP_SPI (1 << 4) /* Talks only SPI protocols */
119#define MMC_CAP_NEEDS_POLL (1 << 5) /* Needs polling for card-detection */ 149#define MMC_CAP_NEEDS_POLL (1 << 5) /* Needs polling for card-detection */
120#define MMC_CAP_8_BIT_DATA (1 << 6) /* Can the host do 8 bit transfers */ 150#define MMC_CAP_8_BIT_DATA (1 << 6) /* Can the host do 8 bit transfers */
151#define MMC_CAP_DISABLE (1 << 7) /* Can the host be disabled */
152#define MMC_CAP_NONREMOVABLE (1 << 8) /* Nonremovable e.g. eMMC */
153#define MMC_CAP_WAIT_WHILE_BUSY (1 << 9) /* Waits while card is busy */
121 154
122 /* host specific block data */ 155 /* host specific block data */
123 unsigned int max_seg_size; /* see blk_queue_max_segment_size */ 156 unsigned int max_seg_size; /* see blk_queue_max_segment_size */
@@ -142,9 +175,18 @@ struct mmc_host {
142 unsigned int removed:1; /* host is being removed */ 175 unsigned int removed:1; /* host is being removed */
143#endif 176#endif
144 177
178 /* Only used with MMC_CAP_DISABLE */
179 int enabled; /* host is enabled */
180 int nesting_cnt; /* "enable" nesting count */
181 int en_dis_recurs; /* detect recursion */
182 unsigned int disable_delay; /* disable delay in msecs */
183 struct delayed_work disable; /* disabling work */
184
145 struct mmc_card *card; /* device attached to this host */ 185 struct mmc_card *card; /* device attached to this host */
146 186
147 wait_queue_head_t wq; 187 wait_queue_head_t wq;
188 struct task_struct *claimer; /* task that has host claimed */
189 int claim_cnt; /* "claim" nesting count */
148 190
149 struct delayed_work detect; 191 struct delayed_work detect;
150 192
@@ -183,6 +225,9 @@ static inline void *mmc_priv(struct mmc_host *host)
183extern int mmc_suspend_host(struct mmc_host *, pm_message_t); 225extern int mmc_suspend_host(struct mmc_host *, pm_message_t);
184extern int mmc_resume_host(struct mmc_host *); 226extern int mmc_resume_host(struct mmc_host *);
185 227
228extern void mmc_power_save_host(struct mmc_host *host);
229extern void mmc_power_restore_host(struct mmc_host *host);
230
186extern void mmc_detect_change(struct mmc_host *, unsigned long delay); 231extern void mmc_detect_change(struct mmc_host *, unsigned long delay);
187extern void mmc_request_done(struct mmc_host *, struct mmc_request *); 232extern void mmc_request_done(struct mmc_host *, struct mmc_request *);
188 233
@@ -197,5 +242,19 @@ struct regulator;
197int mmc_regulator_get_ocrmask(struct regulator *supply); 242int mmc_regulator_get_ocrmask(struct regulator *supply);
198int mmc_regulator_set_ocr(struct regulator *supply, unsigned short vdd_bit); 243int mmc_regulator_set_ocr(struct regulator *supply, unsigned short vdd_bit);
199 244
245int mmc_card_awake(struct mmc_host *host);
246int mmc_card_sleep(struct mmc_host *host);
247int mmc_card_can_sleep(struct mmc_host *host);
248
249int mmc_host_enable(struct mmc_host *host);
250int mmc_host_disable(struct mmc_host *host);
251int mmc_host_lazy_disable(struct mmc_host *host);
252
253static inline void mmc_set_disable_delay(struct mmc_host *host,
254 unsigned int disable_delay)
255{
256 host->disable_delay = disable_delay;
257}
258
200#endif 259#endif
201 260