diff options
Diffstat (limited to 'include/linux/mmc')
-rw-r--r-- | include/linux/mmc/host.h | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 3e7615e9087e..338a9b3d51e4 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
@@ -51,6 +51,35 @@ struct mmc_ios { | |||
51 | }; | 51 | }; |
52 | 52 | ||
53 | struct mmc_host_ops { | 53 | struct mmc_host_ops { |
54 | /* | ||
55 | * Hosts that support power saving can use the 'enable' and 'disable' | ||
56 | * methods to exit and enter power saving states. 'enable' is called | ||
57 | * when the host is claimed and 'disable' is called (or scheduled with | ||
58 | * a delay) when the host is released. The 'disable' is scheduled if | ||
59 | * the disable delay set by 'mmc_set_disable_delay()' is non-zero, | ||
60 | * otherwise 'disable' is called immediately. 'disable' may be | ||
61 | * scheduled repeatedly, to permit ever greater power saving at the | ||
62 | * expense of ever greater latency to re-enable. Rescheduling is | ||
63 | * determined by the return value of the 'disable' method. A positive | ||
64 | * value gives the delay in milliseconds. | ||
65 | * | ||
66 | * In the case where a host function (like set_ios) may be called | ||
67 | * with or without the host claimed, enabling and disabling can be | ||
68 | * done directly and will nest correctly. Call 'mmc_host_enable()' and | ||
69 | * 'mmc_host_lazy_disable()' for this purpose, but note that these | ||
70 | * functions must be paired. | ||
71 | * | ||
72 | * Alternatively, 'mmc_host_enable()' may be paired with | ||
73 | * 'mmc_host_disable()' which calls 'disable' immediately. In this | ||
74 | * case the 'disable' method will be called with 'lazy' set to 0. | ||
75 | * This is mainly useful for error paths. | ||
76 | * | ||
77 | * Because lazy disable may be called from a work queue, the 'disable' | ||
78 | * method must claim the host when 'lazy' != 0, which will work | ||
79 | * correctly because recursion is detected and handled. | ||
80 | */ | ||
81 | int (*enable)(struct mmc_host *host); | ||
82 | int (*disable)(struct mmc_host *host, int lazy); | ||
54 | void (*request)(struct mmc_host *host, struct mmc_request *req); | 83 | void (*request)(struct mmc_host *host, struct mmc_request *req); |
55 | /* | 84 | /* |
56 | * Avoid calling these three functions too often or in a "fast path", | 85 | * Avoid calling these three functions too often or in a "fast path", |
@@ -118,6 +147,7 @@ struct mmc_host { | |||
118 | #define MMC_CAP_SPI (1 << 4) /* Talks only SPI protocols */ | 147 | #define MMC_CAP_SPI (1 << 4) /* Talks only SPI protocols */ |
119 | #define MMC_CAP_NEEDS_POLL (1 << 5) /* Needs polling for card-detection */ | 148 | #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 */ | 149 | #define MMC_CAP_8_BIT_DATA (1 << 6) /* Can the host do 8 bit transfers */ |
150 | #define MMC_CAP_DISABLE (1 << 7) /* Can the host be disabled */ | ||
121 | 151 | ||
122 | /* host specific block data */ | 152 | /* host specific block data */ |
123 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ | 153 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ |
@@ -142,6 +172,13 @@ struct mmc_host { | |||
142 | unsigned int removed:1; /* host is being removed */ | 172 | unsigned int removed:1; /* host is being removed */ |
143 | #endif | 173 | #endif |
144 | 174 | ||
175 | /* Only used with MMC_CAP_DISABLE */ | ||
176 | int enabled; /* host is enabled */ | ||
177 | int nesting_cnt; /* "enable" nesting count */ | ||
178 | int en_dis_recurs; /* detect recursion */ | ||
179 | unsigned int disable_delay; /* disable delay in msecs */ | ||
180 | struct delayed_work disable; /* disabling work */ | ||
181 | |||
145 | struct mmc_card *card; /* device attached to this host */ | 182 | struct mmc_card *card; /* device attached to this host */ |
146 | 183 | ||
147 | wait_queue_head_t wq; | 184 | wait_queue_head_t wq; |
@@ -197,5 +234,15 @@ struct regulator; | |||
197 | int mmc_regulator_get_ocrmask(struct regulator *supply); | 234 | int mmc_regulator_get_ocrmask(struct regulator *supply); |
198 | int mmc_regulator_set_ocr(struct regulator *supply, unsigned short vdd_bit); | 235 | int mmc_regulator_set_ocr(struct regulator *supply, unsigned short vdd_bit); |
199 | 236 | ||
237 | int mmc_host_enable(struct mmc_host *host); | ||
238 | int mmc_host_disable(struct mmc_host *host); | ||
239 | int mmc_host_lazy_disable(struct mmc_host *host); | ||
240 | |||
241 | static inline void mmc_set_disable_delay(struct mmc_host *host, | ||
242 | unsigned int disable_delay) | ||
243 | { | ||
244 | host->disable_delay = disable_delay; | ||
245 | } | ||
246 | |||
200 | #endif | 247 | #endif |
201 | 248 | ||