diff options
Diffstat (limited to 'include/linux/mmc/host.h')
-rw-r--r-- | include/linux/mmc/host.h | 59 |
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 | ||
53 | struct mmc_host_ops { | 54 | struct 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) | |||
183 | extern int mmc_suspend_host(struct mmc_host *, pm_message_t); | 225 | extern int mmc_suspend_host(struct mmc_host *, pm_message_t); |
184 | extern int mmc_resume_host(struct mmc_host *); | 226 | extern int mmc_resume_host(struct mmc_host *); |
185 | 227 | ||
228 | extern void mmc_power_save_host(struct mmc_host *host); | ||
229 | extern void mmc_power_restore_host(struct mmc_host *host); | ||
230 | |||
186 | extern void mmc_detect_change(struct mmc_host *, unsigned long delay); | 231 | extern void mmc_detect_change(struct mmc_host *, unsigned long delay); |
187 | extern void mmc_request_done(struct mmc_host *, struct mmc_request *); | 232 | extern void mmc_request_done(struct mmc_host *, struct mmc_request *); |
188 | 233 | ||
@@ -197,5 +242,19 @@ struct regulator; | |||
197 | int mmc_regulator_get_ocrmask(struct regulator *supply); | 242 | int mmc_regulator_get_ocrmask(struct regulator *supply); |
198 | int mmc_regulator_set_ocr(struct regulator *supply, unsigned short vdd_bit); | 243 | int mmc_regulator_set_ocr(struct regulator *supply, unsigned short vdd_bit); |
199 | 244 | ||
245 | int mmc_card_awake(struct mmc_host *host); | ||
246 | int mmc_card_sleep(struct mmc_host *host); | ||
247 | int mmc_card_can_sleep(struct mmc_host *host); | ||
248 | |||
249 | int mmc_host_enable(struct mmc_host *host); | ||
250 | int mmc_host_disable(struct mmc_host *host); | ||
251 | int mmc_host_lazy_disable(struct mmc_host *host); | ||
252 | |||
253 | static 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 | ||