11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  linux/include/linux/mmc/host.h
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License version 2 as
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Host driver specific definitions.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef LINUX_MMC_HOST_H
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LINUX_MMC_HOST_H
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13af8350c756cb48a738474738f7bf8c0e572fa057Pierre Ossman#include <linux/leds.h>
14a7d1a1ebd8f5858a812ac3d5fbbc178b4959a63bGuennadi Liakhovetski#include <linux/mutex.h>
15d43c36dc6b357fa1806800f18aa30123c747a6d1Alexey Dobriyan#include <linux/sched.h>
16313162d0b83836e2f57e51b9b8650fb4b9c396eaPaul Gortmaker#include <linux/device.h>
171b676f70c108cda90cf9d114d16c677584400efcPer Forlin#include <linux/fault-inject.h>
18af8350c756cb48a738474738f7bf8c0e572fa057Pierre Ossman
19aaac1b470bd0dccb30912356617069dc6199cc80Pierre Ossman#include <linux/mmc/core.h>
20cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon#include <linux/mmc/card.h>
21da68c4eb258cd9f3f0b8aeb7e46b8118bb6358b6Nicolas Pitre#include <linux/mmc/pm.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct mmc_ios {
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	clock;			/* clock rate */
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned short	vdd;
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
274be34c99a2f3aa90fa42e62c0918f07afb8a645bPhilip Langdale/* vdd stores the bit number of the selected voltage range from below. */
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	bus_mode;		/* command output mode */
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MMC_BUSMODE_OPENDRAIN	1
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MMC_BUSMODE_PUSHPULL	2
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34865e9f13c94891daed4f6a5f69c5d6ec04d4932fPierre Ossman	unsigned char	chip_select;		/* SPI chip select */
35865e9f13c94891daed4f6a5f69c5d6ec04d4932fPierre Ossman
36865e9f13c94891daed4f6a5f69c5d6ec04d4932fPierre Ossman#define MMC_CS_DONTCARE		0
37865e9f13c94891daed4f6a5f69c5d6ec04d4932fPierre Ossman#define MMC_CS_HIGH		1
38865e9f13c94891daed4f6a5f69c5d6ec04d4932fPierre Ossman#define MMC_CS_LOW		2
39865e9f13c94891daed4f6a5f69c5d6ec04d4932fPierre Ossman
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	power_mode;		/* power supply mode */
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MMC_POWER_OFF		0
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MMC_POWER_UP		1
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MMC_POWER_ON		2
458af465db967bf25a4617416c0cbaaaa506d444f5Roger Tseng#define MMC_POWER_UNDEFINED	3
46f218278a456b3c272b480443c89004c3d2a49f18Pierre Ossman
47f218278a456b3c272b480443c89004c3d2a49f18Pierre Ossman	unsigned char	bus_width;		/* data bus width */
48f218278a456b3c272b480443c89004c3d2a49f18Pierre Ossman
49f218278a456b3c272b480443c89004c3d2a49f18Pierre Ossman#define MMC_BUS_WIDTH_1		0
50f218278a456b3c272b480443c89004c3d2a49f18Pierre Ossman#define MMC_BUS_WIDTH_4		2
51b30f8af3358b5c66be223e3a9f3d11b3d02b4a8fJarkko Lavinen#define MMC_BUS_WIDTH_8		3
52cd9277c011a99769fa371521b460ed57f6d280b1Pierre Ossman
53cd9277c011a99769fa371521b460ed57f6d280b1Pierre Ossman	unsigned char	timing;			/* timing specification used */
54cd9277c011a99769fa371521b460ed57f6d280b1Pierre Ossman
55cd9277c011a99769fa371521b460ed57f6d280b1Pierre Ossman#define MMC_TIMING_LEGACY	0
56cd9277c011a99769fa371521b460ed57f6d280b1Pierre Ossman#define MMC_TIMING_MMC_HS	1
57cd9277c011a99769fa371521b460ed57f6d280b1Pierre Ossman#define MMC_TIMING_SD_HS	2
58ed9dbb6effc3516a1211a936be9bd67c03fdf858Kevin Liu#define MMC_TIMING_UHS_SDR12	3
59ed9dbb6effc3516a1211a936be9bd67c03fdf858Kevin Liu#define MMC_TIMING_UHS_SDR25	4
60ed9dbb6effc3516a1211a936be9bd67c03fdf858Kevin Liu#define MMC_TIMING_UHS_SDR50	5
61ed9dbb6effc3516a1211a936be9bd67c03fdf858Kevin Liu#define MMC_TIMING_UHS_SDR104	6
62ed9dbb6effc3516a1211a936be9bd67c03fdf858Kevin Liu#define MMC_TIMING_UHS_DDR50	7
6379f7ae7c45a6ccf04e2908337461dee615f6afb0Seungwon Jeon#define MMC_TIMING_MMC_DDR52	8
6479f7ae7c45a6ccf04e2908337461dee615f6afb0Seungwon Jeon#define MMC_TIMING_MMC_HS200	9
650a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon#define MMC_TIMING_MMC_HS400	10
660f8d8ea64ec7c77ca5beb59534d386fe0235961aAdrian Hunter
67f2119df6b764609af4baceb68caf1e848c1c8aa7Arindam Nath	unsigned char	signal_voltage;		/* signalling voltage (1.8V or 3.3V) */
68f2119df6b764609af4baceb68caf1e848c1c8aa7Arindam Nath
69f2119df6b764609af4baceb68caf1e848c1c8aa7Arindam Nath#define MMC_SIGNAL_VOLTAGE_330	0
70f2119df6b764609af4baceb68caf1e848c1c8aa7Arindam Nath#define MMC_SIGNAL_VOLTAGE_180	1
714c4cb171054230c2e58ed6574d7faa1871c75bbePhilip Rakity#define MMC_SIGNAL_VOLTAGE_120	2
72d6d50a15a2897d4133d536dd4343b5cf21163db3Arindam Nath
73d6d50a15a2897d4133d536dd4343b5cf21163db3Arindam Nath	unsigned char	drv_type;		/* driver type (A, B, C, D) */
74d6d50a15a2897d4133d536dd4343b5cf21163db3Arindam Nath
75d6d50a15a2897d4133d536dd4343b5cf21163db3Arindam Nath#define MMC_SET_DRIVER_TYPE_B	0
76d6d50a15a2897d4133d536dd4343b5cf21163db3Arindam Nath#define MMC_SET_DRIVER_TYPE_A	1
77d6d50a15a2897d4133d536dd4343b5cf21163db3Arindam Nath#define MMC_SET_DRIVER_TYPE_C	2
78d6d50a15a2897d4133d536dd4343b5cf21163db3Arindam Nath#define MMC_SET_DRIVER_TYPE_D	3
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct mmc_host_ops {
828ea926b22e2d13238e4d65d8f61c48fe424e6f4fAdrian Hunter	/*
83907d2e7cc7ebba4ab398422a7f0435e1802be65bAdrian Hunter	 * 'enable' is called when the host is claimed and 'disable' is called
84907d2e7cc7ebba4ab398422a7f0435e1802be65bAdrian Hunter	 * when the host is released. 'enable' and 'disable' are deprecated.
858ea926b22e2d13238e4d65d8f61c48fe424e6f4fAdrian Hunter	 */
868ea926b22e2d13238e4d65d8f61c48fe424e6f4fAdrian Hunter	int (*enable)(struct mmc_host *host);
87907d2e7cc7ebba4ab398422a7f0435e1802be65bAdrian Hunter	int (*disable)(struct mmc_host *host);
88aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	/*
89aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	 * It is optional for the host to implement pre_req and post_req in
90aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	 * order to support double buffering of requests (prepare one
91aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	 * request while another request is active).
927c8a2829c22a270acadc6aa3a937e2e7956b19f5Per Forlin	 * pre_req() must always be followed by a post_req().
937c8a2829c22a270acadc6aa3a937e2e7956b19f5Per Forlin	 * To undo a call made to pre_req(), call post_req() with
947c8a2829c22a270acadc6aa3a937e2e7956b19f5Per Forlin	 * a nonzero err condition.
95aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	 */
96aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	void	(*post_req)(struct mmc_host *host, struct mmc_request *req,
97aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin			    int err);
98aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	void	(*pre_req)(struct mmc_host *host, struct mmc_request *req,
99aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin			   bool is_first_req);
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void	(*request)(struct mmc_host *host, struct mmc_request *req);
10128f52482b41edc88cdf575aa6ed414c6e116ce10Anton Vorontsov	/*
10228f52482b41edc88cdf575aa6ed414c6e116ce10Anton Vorontsov	 * Avoid calling these three functions too often or in a "fast path",
10328f52482b41edc88cdf575aa6ed414c6e116ce10Anton Vorontsov	 * since underlaying controller might implement them in an expensive
10428f52482b41edc88cdf575aa6ed414c6e116ce10Anton Vorontsov	 * and/or slow way.
10528f52482b41edc88cdf575aa6ed414c6e116ce10Anton Vorontsov	 *
10628f52482b41edc88cdf575aa6ed414c6e116ce10Anton Vorontsov	 * Also note that these functions might sleep, so don't call them
10728f52482b41edc88cdf575aa6ed414c6e116ce10Anton Vorontsov	 * in the atomic contexts!
10808f80bb5196517a0dfe50dc7c10f234c0ff2f0e8Anton Vorontsov	 *
10908f80bb5196517a0dfe50dc7c10f234c0ff2f0e8Anton Vorontsov	 * Return values for the get_ro callback should be:
11008f80bb5196517a0dfe50dc7c10f234c0ff2f0e8Anton Vorontsov	 *   0 for a read/write card
11108f80bb5196517a0dfe50dc7c10f234c0ff2f0e8Anton Vorontsov	 *   1 for a read-only card
11208f80bb5196517a0dfe50dc7c10f234c0ff2f0e8Anton Vorontsov	 *   -ENOSYS when not supported (equal to NULL callback)
11308f80bb5196517a0dfe50dc7c10f234c0ff2f0e8Anton Vorontsov	 *   or a negative errno value when something bad happened
11408f80bb5196517a0dfe50dc7c10f234c0ff2f0e8Anton Vorontsov	 *
115ee63a7d2287c677ed022bf3f584f5a187b6c402fThomas Petazzoni	 * Return values for the get_cd callback should be:
11608f80bb5196517a0dfe50dc7c10f234c0ff2f0e8Anton Vorontsov	 *   0 for a absent card
11708f80bb5196517a0dfe50dc7c10f234c0ff2f0e8Anton Vorontsov	 *   1 for a present card
11808f80bb5196517a0dfe50dc7c10f234c0ff2f0e8Anton Vorontsov	 *   -ENOSYS when not supported (equal to NULL callback)
11908f80bb5196517a0dfe50dc7c10f234c0ff2f0e8Anton Vorontsov	 *   or a negative errno value when something bad happened
12028f52482b41edc88cdf575aa6ed414c6e116ce10Anton Vorontsov	 */
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void	(*set_ios)(struct mmc_host *host, struct mmc_ios *ios);
122a00fc09029f02ca833cf90e5d5625f08c4ac4f51Pierre Ossman	int	(*get_ro)(struct mmc_host *host);
12328f52482b41edc88cdf575aa6ed414c6e116ce10Anton Vorontsov	int	(*get_cd)(struct mmc_host *host);
12428f52482b41edc88cdf575aa6ed414c6e116ce10Anton Vorontsov
12517b759aff916b4d02721e75ce5ed82b1903e5bd6Nicolas Pitre	void	(*enable_sdio_irq)(struct mmc_host *host, int enable);
1263fcb027d7fd749569665d34a79ce2a8e00bc2ed6Daniel Mack
1273fcb027d7fd749569665d34a79ce2a8e00bc2ed6Daniel Mack	/* optional callback for HC quirks */
1283fcb027d7fd749569665d34a79ce2a8e00bc2ed6Daniel Mack	void	(*init_card)(struct mmc_host *host, struct mmc_card *card);
129f2119df6b764609af4baceb68caf1e848c1c8aa7Arindam Nath
130f2119df6b764609af4baceb68caf1e848c1c8aa7Arindam Nath	int	(*start_signal_voltage_switch)(struct mmc_host *host, struct mmc_ios *ios);
131a4924c71aa43d4f8a3f342b1f71788349472e684Girish K S
132d887874e0ead6a0b86b6046b872730c81c121352Johan Rudholm	/* Check if the card is pulling dat[0:3] low */
133d887874e0ead6a0b86b6046b872730c81c121352Johan Rudholm	int	(*card_busy)(struct mmc_host *host);
134d887874e0ead6a0b86b6046b872730c81c121352Johan Rudholm
135a4924c71aa43d4f8a3f342b1f71788349472e684Girish K S	/* The tuning command opcode value is different for SD and eMMC cards */
136a4924c71aa43d4f8a3f342b1f71788349472e684Girish K S	int	(*execute_tuning)(struct mmc_host *host, u32 opcode);
1370a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon
1380a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon	/* Prepare HS400 target operating frequency depending host driver */
1390a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon	int	(*prepare_hs400_tuning)(struct mmc_host *host, struct mmc_ios *ios);
140ca8e99b32e3863c98ac958617cc157a00bf445b8Philip Rakity	int	(*select_drive_strength)(unsigned int max_dtr, int host_drv, int card_drv);
141b2499518b5ad7e28bb3ed348fd3f370eeb1e36c0Adrian Hunter	void	(*hw_reset)(struct mmc_host *host);
1429f1fb60a2338aa2202ca94d67f84c582f31dbf5aGuennadi Liakhovetski	void	(*card_event)(struct mmc_host *host);
1432e47e84245adcb1b3872210678b6146f674fb3ffKuninori Morimoto
1442e47e84245adcb1b3872210678b6146f674fb3ffKuninori Morimoto	/*
1452e47e84245adcb1b3872210678b6146f674fb3ffKuninori Morimoto	 * Optional callback to support controllers with HW issues for multiple
1462e47e84245adcb1b3872210678b6146f674fb3ffKuninori Morimoto	 * I/O. Returns the number of supported blocks for the request.
1472e47e84245adcb1b3872210678b6146f674fb3ffKuninori Morimoto	 */
1482e47e84245adcb1b3872210678b6146f674fb3ffKuninori Morimoto	int	(*multi_io_quirk)(struct mmc_card *card,
1492e47e84245adcb1b3872210678b6146f674fb3ffKuninori Morimoto				  unsigned int direction, int blk_size);
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct mmc_card;
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct device;
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
155aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlinstruct mmc_async_req {
156aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	/* active mmc request */
157aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	struct mmc_request	*mrq;
158aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	/*
159aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	 * Check error status of completed mmc request.
160aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	 * Returns 0 if success otherwise non zero.
161aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	 */
162aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	int (*err_check) (struct mmc_card *, struct mmc_async_req *);
163aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin};
164aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin
16527410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski/**
16627410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski * struct mmc_slot - MMC slot functions
16727410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski *
16827410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski * @cd_irq:		MMC/SD-card slot hotplug detection IRQ or -EINVAL
169a7d1a1ebd8f5858a812ac3d5fbbc178b4959a63bGuennadi Liakhovetski * @lock:		protect the @handler_priv pointer
17027410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski * @handler_priv:	MMC/SD-card slot context
17127410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski *
17227410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski * Some MMC/SD host controllers implement slot-functions like card and
17327410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski * write-protect detection natively. However, a large number of controllers
17427410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski * leave these functions to the CPU. This struct provides a hook to attach
17527410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski * such slot-function drivers.
17627410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski */
17727410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetskistruct mmc_slot {
17827410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski	int cd_irq;
179a7d1a1ebd8f5858a812ac3d5fbbc178b4959a63bGuennadi Liakhovetski	struct mutex lock;
180b67e198073b2d2f16572f5fa77553fec14775f69Guennadi Liakhovetski	void *handler_priv;
181b67e198073b2d2f16572f5fa77553fec14775f69Guennadi Liakhovetski};
182b67e198073b2d2f16572f5fa77553fec14775f69Guennadi Liakhovetski
1832220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman/**
1842220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman * mmc_context_info - synchronization details for mmc context
1852220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman * @is_done_rcv		wake up reason was done request
1862220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman * @is_new_req		wake up reason was new request
1872220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman * @is_waiting_last_req	mmc context waiting for single running request
1882220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman * @wait		wait queue
1892220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman * @lock		lock to protect data fields
1902220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman */
1912220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfmanstruct mmc_context_info {
1922220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman	bool			is_done_rcv;
1932220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman	bool			is_new_req;
1942220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman	bool			is_waiting_last_req;
1952220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman	wait_queue_head_t	wait;
1962220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman	spinlock_t		lock;
1972220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman};
1982220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman
199e137788dd115dd9d21759a768dba5fff9685e587Guennadi Liakhovetskistruct regulator;
200e137788dd115dd9d21759a768dba5fff9685e587Guennadi Liakhovetski
201e137788dd115dd9d21759a768dba5fff9685e587Guennadi Liakhovetskistruct mmc_supply {
202e137788dd115dd9d21759a768dba5fff9685e587Guennadi Liakhovetski	struct regulator *vmmc;		/* Card power supply */
203e137788dd115dd9d21759a768dba5fff9685e587Guennadi Liakhovetski	struct regulator *vqmmc;	/* Optional Vccq supply */
204e137788dd115dd9d21759a768dba5fff9685e587Guennadi Liakhovetski};
205e137788dd115dd9d21759a768dba5fff9685e587Guennadi Liakhovetski
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct mmc_host {
207fcaf71fd51f9cfc504455d3e19ec242e4b2073edGreg Kroah-Hartman	struct device		*parent;
208fcaf71fd51f9cfc504455d3e19ec242e4b2073edGreg Kroah-Hartman	struct device		class_dev;
209dce773771834221817e2d359a7e07a618ba08807Russell King	int			index;
210f57b225e432d80ee46f48536cc55ea6cf62c5570David Brownell	const struct mmc_host_ops *ops;
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int		f_min;
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int		f_max;
21388ae8b866488031b0e2fc05a27440fefec5e6927Hein Tibosch	unsigned int		f_init;
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32			ocr_avail;
2158f230f454fe04ba326ffaead3a6b88dcf44eaf4bTakashi Iwai	u32			ocr_avail_sdio;	/* SDIO-specific OCR */
2168f230f454fe04ba326ffaead3a6b88dcf44eaf4bTakashi Iwai	u32			ocr_avail_sd;	/* SD-specific OCR */
2178f230f454fe04ba326ffaead3a6b88dcf44eaf4bTakashi Iwai	u32			ocr_avail_mmc;	/* MMC-specific OCR */
2184c2ef25fe0b847d2ae818f74758ddb0be1c27d8eMaxim Levitsky	struct notifier_block	pm_notify;
21955c4665ea0a42fd6427826bfce96eb4b0389262aAaron Lu	u32			max_current_330;
22055c4665ea0a42fd6427826bfce96eb4b0389262aAaron Lu	u32			max_current_300;
22155c4665ea0a42fd6427826bfce96eb4b0389262aAaron Lu	u32			max_current_180;
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
22355556da01284af8c2174b786b3eca8e11301b656Philip Langdale#define MMC_VDD_165_195		0x00000080	/* VDD voltage 1.65 - 1.95 */
224f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_20_21		0x00000100	/* VDD voltage 2.0 ~ 2.1 */
225f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_21_22		0x00000200	/* VDD voltage 2.1 ~ 2.2 */
226f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_22_23		0x00000400	/* VDD voltage 2.2 ~ 2.3 */
227f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_23_24		0x00000800	/* VDD voltage 2.3 ~ 2.4 */
228f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_24_25		0x00001000	/* VDD voltage 2.4 ~ 2.5 */
229f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_25_26		0x00002000	/* VDD voltage 2.5 ~ 2.6 */
230f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_26_27		0x00004000	/* VDD voltage 2.6 ~ 2.7 */
231f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_27_28		0x00008000	/* VDD voltage 2.7 ~ 2.8 */
232f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_28_29		0x00010000	/* VDD voltage 2.8 ~ 2.9 */
233f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_29_30		0x00020000	/* VDD voltage 2.9 ~ 3.0 */
234f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_30_31		0x00040000	/* VDD voltage 3.0 ~ 3.1 */
235f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_31_32		0x00080000	/* VDD voltage 3.1 ~ 3.2 */
236f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_32_33		0x00100000	/* VDD voltage 3.2 ~ 3.3 */
237f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_33_34		0x00200000	/* VDD voltage 3.3 ~ 3.4 */
238f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_34_35		0x00400000	/* VDD voltage 3.4 ~ 3.5 */
239f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman#define MMC_VDD_35_36		0x00800000	/* VDD voltage 3.5 ~ 3.6 */
240f74d132cec60b686bce1f284822c1a496700bd3cPierre Ossman
2415f1a4dd0372038f2490afa4540cd66b8d092839eLee Jones	u32			caps;		/* Host capabilities */
242f218278a456b3c272b480443c89004c3d2a49f18Pierre Ossman
243f218278a456b3c272b480443c89004c3d2a49f18Pierre Ossman#define MMC_CAP_4_BIT_DATA	(1 << 0)	/* Can the host do 4 bit transfers */
24423af60398af2f5033e2f53665538a09f498dbc03Pierre Ossman#define MMC_CAP_MMC_HIGHSPEED	(1 << 1)	/* Can do MMC high-speed timing */
24523af60398af2f5033e2f53665538a09f498dbc03Pierre Ossman#define MMC_CAP_SD_HIGHSPEED	(1 << 2)	/* Can do SD high-speed timing */
24623af60398af2f5033e2f53665538a09f498dbc03Pierre Ossman#define MMC_CAP_SDIO_IRQ	(1 << 3)	/* Can signal pending SDIO IRQs */
24723af60398af2f5033e2f53665538a09f498dbc03Pierre Ossman#define MMC_CAP_SPI		(1 << 4)	/* Talks only SPI protocols */
24823af60398af2f5033e2f53665538a09f498dbc03Pierre Ossman#define MMC_CAP_NEEDS_POLL	(1 << 5)	/* Needs polling for card-detection */
249b30f8af3358b5c66be223e3a9f3d11b3d02b4a8fJarkko Lavinen#define MMC_CAP_8_BIT_DATA	(1 << 6)	/* Can the host do 8 bit transfers */
250c4d770d72492df510077b277f21ac5f0dad9e5ebUlf Hansson#define MMC_CAP_AGGRESSIVE_PM	(1 << 7)	/* Suspend (e)MMC/SD at idle  */
2519feae246963c648b212abad0f0eb8938de5f5fe5Adrian Hunter#define MMC_CAP_NONREMOVABLE	(1 << 8)	/* Nonremovable e.g. eMMC */
252b1ebe38456f7fe61a88af2844361e763ac6ea5aeJarkko Lavinen#define MMC_CAP_WAIT_WHILE_BUSY	(1 << 9)	/* Waits while card is busy */
253dfe86cba7676d58db8de7e623f5e72f1b0d3ca35Adrian Hunter#define MMC_CAP_ERASE		(1 << 10)	/* Allow erase/trim commands */
254dfc13e8402c75e7c2e0a52e123c0500a3259866bHanumath Prasad#define MMC_CAP_1_8V_DDR	(1 << 11)	/* can support */
255dfc13e8402c75e7c2e0a52e123c0500a3259866bHanumath Prasad						/* DDR mode at 1.8V */
256dfc13e8402c75e7c2e0a52e123c0500a3259866bHanumath Prasad#define MMC_CAP_1_2V_DDR	(1 << 12)	/* can support */
257dfc13e8402c75e7c2e0a52e123c0500a3259866bHanumath Prasad						/* DDR mode at 1.2V */
258ed919b0125b26dcc052e44836f66e7e1f5c49c7eOhad Ben-Cohen#define MMC_CAP_POWER_OFF_CARD	(1 << 13)	/* Can power off after boot */
25922113efd00491310da802f3b1a9a66cfcf415facAries Lee#define MMC_CAP_BUS_WIDTH_TEST	(1 << 14)	/* CMD14/CMD19 bus width ok */
260f2119df6b764609af4baceb68caf1e848c1c8aa7Arindam Nath#define MMC_CAP_UHS_SDR12	(1 << 15)	/* Host supports UHS SDR12 mode */
261f2119df6b764609af4baceb68caf1e848c1c8aa7Arindam Nath#define MMC_CAP_UHS_SDR25	(1 << 16)	/* Host supports UHS SDR25 mode */
262f2119df6b764609af4baceb68caf1e848c1c8aa7Arindam Nath#define MMC_CAP_UHS_SDR50	(1 << 17)	/* Host supports UHS SDR50 mode */
263f2119df6b764609af4baceb68caf1e848c1c8aa7Arindam Nath#define MMC_CAP_UHS_SDR104	(1 << 18)	/* Host supports UHS SDR104 mode */
264f2119df6b764609af4baceb68caf1e848c1c8aa7Arindam Nath#define MMC_CAP_UHS_DDR50	(1 << 19)	/* Host supports UHS DDR50 mode */
2654d22378221bd0ed69c2e99408d31c108d72aeb80Ulf Hansson#define MMC_CAP_RUNTIME_RESUME	(1 << 20)	/* Resume at runtime_resume. */
266d6d50a15a2897d4133d536dd4343b5cf21163db3Arindam Nath#define MMC_CAP_DRIVER_TYPE_A	(1 << 23)	/* Host supports Driver Type A */
267d6d50a15a2897d4133d536dd4343b5cf21163db3Arindam Nath#define MMC_CAP_DRIVER_TYPE_C	(1 << 24)	/* Host supports Driver Type C */
268d6d50a15a2897d4133d536dd4343b5cf21163db3Arindam Nath#define MMC_CAP_DRIVER_TYPE_D	(1 << 25)	/* Host supports Driver Type D */
269d0c97cfb81ebc5b416c0f92fa2fc18d2773e3023Andrei Warkentin#define MMC_CAP_CMD23		(1 << 30)	/* CMD23 supported. */
270b2499518b5ad7e28bb3ed348fd3f370eeb1e36c0Adrian Hunter#define MMC_CAP_HW_RESET	(1 << 31)	/* Hardware reset */
271f218278a456b3c272b480443c89004c3d2a49f18Pierre Ossman
2725f1a4dd0372038f2490afa4540cd66b8d092839eLee Jones	u32			caps2;		/* More host capabilities */
273f7c56ef2af5ae7e4c24c3c79427b38d18ba1d294Adrian Hunter
274f7c56ef2af5ae7e4c24c3c79427b38d18ba1d294Adrian Hunter#define MMC_CAP2_BOOTPART_NOACC	(1 << 0)	/* Boot partition no access */
27553275c2136cc76b6ff26f8bec268c4bef9bab837Ulf Hansson#define MMC_CAP2_FULL_PWR_CYCLE	(1 << 2)	/* Can do full power cycle */
276a4924c71aa43d4f8a3f342b1f71788349472e684Girish K S#define MMC_CAP2_HS200_1_8V_SDR	(1 << 5)        /* can support */
277a4924c71aa43d4f8a3f342b1f71788349472e684Girish K S#define MMC_CAP2_HS200_1_2V_SDR	(1 << 6)        /* can support */
278a4924c71aa43d4f8a3f342b1f71788349472e684Girish K S#define MMC_CAP2_HS200		(MMC_CAP2_HS200_1_8V_SDR | \
279a4924c71aa43d4f8a3f342b1f71788349472e684Girish K S				 MMC_CAP2_HS200_1_2V_SDR)
28083bb24aaa4af2ec7c127cc2a5fa7ca9f64cdd13dAdrian Hunter#define MMC_CAP2_HC_ERASE_SZ	(1 << 9)	/* High-capacity erase size */
2815c08d7fae0815cd163a98e05c8d94fc0de77ff67Guennadi Liakhovetski#define MMC_CAP2_CD_ACTIVE_HIGH	(1 << 10)	/* Card-detect signal active high */
2825c08d7fae0815cd163a98e05c8d94fc0de77ff67Guennadi Liakhovetski#define MMC_CAP2_RO_ACTIVE_HIGH	(1 << 11)	/* Write-protect signal active high */
283abd9ac144947d9a604beb763339e2f77ce8bec79Seungwon Jeon#define MMC_CAP2_PACKED_RD	(1 << 12)	/* Allow packed read */
284abd9ac144947d9a604beb763339e2f77ce8bec79Seungwon Jeon#define MMC_CAP2_PACKED_WR	(1 << 13)	/* Allow packed write */
285abd9ac144947d9a604beb763339e2f77ce8bec79Seungwon Jeon#define MMC_CAP2_PACKED_CMD	(MMC_CAP2_PACKED_RD | \
286abd9ac144947d9a604beb763339e2f77ce8bec79Seungwon Jeon				 MMC_CAP2_PACKED_WR)
2870d3e3350d5871c53464be4c92d57198744247005Adrian Hunter#define MMC_CAP2_NO_PRESCAN_POWERUP (1 << 14)	/* Don't power up before scan */
2880a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon#define MMC_CAP2_HS400_1_8V	(1 << 15)	/* Can support HS400 1.8V */
2890a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon#define MMC_CAP2_HS400_1_2V	(1 << 16)	/* Can support HS400 1.2V */
2900a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon#define MMC_CAP2_HS400		(MMC_CAP2_HS400_1_8V | \
2910a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon				 MMC_CAP2_HS400_1_2V)
292bf3b5ec66bd03d66e9ea729aaca013ea1047a797Russell King#define MMC_CAP2_SDIO_IRQ_NOTHREAD (1 << 17)
293f7c56ef2af5ae7e4c24c3c79427b38d18ba1d294Adrian Hunter
294da68c4eb258cd9f3f0b8aeb7e46b8118bb6358b6Nicolas Pitre	mmc_pm_flag_t		pm_caps;	/* supported pm features */
295da68c4eb258cd9f3f0b8aeb7e46b8118bb6358b6Nicolas Pitre
29604566831a703ae3ef4b49a2deae261c9ed26e020Linus Walleij#ifdef CONFIG_MMC_CLKGATE
29704566831a703ae3ef4b49a2deae261c9ed26e020Linus Walleij	int			clk_requests;	/* internal reference counter */
29804566831a703ae3ef4b49a2deae261c9ed26e020Linus Walleij	unsigned int		clk_delay;	/* number of MCI clk hold cycles */
29904566831a703ae3ef4b49a2deae261c9ed26e020Linus Walleij	bool			clk_gated;	/* clock gated */
300597dd9d79cfbbb1636d00a7fd0880355d9b20c41Sujit Reddy Thumma	struct delayed_work	clk_gate_work; /* delayed clock gate */
30104566831a703ae3ef4b49a2deae261c9ed26e020Linus Walleij	unsigned int		clk_old;	/* old clock value cache */
30204566831a703ae3ef4b49a2deae261c9ed26e020Linus Walleij	spinlock_t		clk_lock;	/* lock for clk fields */
30386f315bbb2374f1f077500ad131dd9b71856e697Chris Ball	struct mutex		clk_gate_mutex;	/* mutex for clock gating */
304597dd9d79cfbbb1636d00a7fd0880355d9b20c41Sujit Reddy Thumma	struct device_attribute clkgate_delay_attr;
305597dd9d79cfbbb1636d00a7fd0880355d9b20c41Sujit Reddy Thumma	unsigned long           clkgate_delay;
30604566831a703ae3ef4b49a2deae261c9ed26e020Linus Walleij#endif
30704566831a703ae3ef4b49a2deae261c9ed26e020Linus Walleij
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* host specific block data */
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int		max_seg_size;	/* see blk_queue_max_segment_size */
310a36274e0184193e393fb82957925c3981a6b0477Martin K. Petersen	unsigned short		max_segs;	/* see blk_queue_max_segments */
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned short		unused;
31255db890a838c7b37256241b1fc53d6344aa79cc0Pierre Ossman	unsigned int		max_req_size;	/* maximum number of bytes in one req */
313fe4a3c7a20f14d86022a8132adbf6ddb98e7197cPierre Ossman	unsigned int		max_blk_size;	/* maximum size of one mmc block */
31455db890a838c7b37256241b1fc53d6344aa79cc0Pierre Ossman	unsigned int		max_blk_count;	/* maximum number of blocks in one req */
31568eb80e06bfa06035d0304686124974780308faeUlf Hansson	unsigned int		max_busy_timeout; /* max busy timeout in ms */
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* private data */
3187ea239d9e6d6993469a6a8ca83ff23834dfc3fcePierre Ossman	spinlock_t		lock;		/* lock for claim and bus ops */
3197ea239d9e6d6993469a6a8ca83ff23834dfc3fcePierre Ossman
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct mmc_ios		ios;		/* current io bus settings */
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32297018580c40c8a31dd7ae744da3378c787a2066dDavid Brownell	/* group bitfields together to minimize padding */
32397018580c40c8a31dd7ae744da3378c787a2066dDavid Brownell	unsigned int		use_spi_crc:1;
32497018580c40c8a31dd7ae744da3378c787a2066dDavid Brownell	unsigned int		claimed:1;	/* host exclusively claimed */
32597018580c40c8a31dd7ae744da3378c787a2066dDavid Brownell	unsigned int		bus_dead:1;	/* bus has been released */
32697018580c40c8a31dd7ae744da3378c787a2066dDavid Brownell#ifdef CONFIG_MMC_DEBUG
32797018580c40c8a31dd7ae744da3378c787a2066dDavid Brownell	unsigned int		removed:1;	/* host is being removed */
32897018580c40c8a31dd7ae744da3378c787a2066dDavid Brownell#endif
32997018580c40c8a31dd7ae744da3378c787a2066dDavid Brownell
3304c2ef25fe0b847d2ae818f74758ddb0be1c27d8eMaxim Levitsky	int			rescan_disable;	/* disable card detection */
3313339d1e33185798a45dbdb5ea6c0bec1c27ca5fdJohan Rudholm	int			rescan_entered;	/* used with nonremovable devices */
3328ea926b22e2d13238e4d65d8f61c48fe424e6f4fAdrian Hunter
333fa372a51cb5f93800f711473e5a36e0e0c9a8f00Markus Mayer	bool			trigger_card_event; /* card_event necessary */
334fa372a51cb5f93800f711473e5a36e0e0c9a8f00Markus Mayer
335b855885e3b60cf6f9452848712a62517b94583ebPierre Ossman	struct mmc_card		*card;		/* device attached to this host */
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	wait_queue_head_t	wq;
338319a3f1429c91147058ac26c5f5bac8ec1730bc6Adrian Hunter	struct task_struct	*claimer;	/* task that has host claimed */
339319a3f1429c91147058ac26c5f5bac8ec1730bc6Adrian Hunter	int			claim_cnt;	/* "claim" nesting count */
340f22ee4edf63e7480511112d9965c71e07be3f8b7Pierre Ossman
341c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells	struct delayed_work	detect;
342d30495048892980e5d453328d1cc9343b3f7e917Adrian Hunter	int			detect_change;	/* card detect flag */
34327410ee7e391ce650d6d0242805f080599be7ad7Guennadi Liakhovetski	struct mmc_slot		slot;
34401357dcac62ac028de65a1c315eb75c530c8a5d6Russell King
3457ea239d9e6d6993469a6a8ca83ff23834dfc3fcePierre Ossman	const struct mmc_bus_ops *bus_ops;	/* current bus driver */
3467ea239d9e6d6993469a6a8ca83ff23834dfc3fcePierre Ossman	unsigned int		bus_refs;	/* reference counter */
3477ea239d9e6d6993469a6a8ca83ff23834dfc3fcePierre Ossman
348d1496c39e500857b8949cdb91af24e0eb8aae4d0Nicolas Pitre	unsigned int		sdio_irqs;
349d1496c39e500857b8949cdb91af24e0eb8aae4d0Nicolas Pitre	struct task_struct	*sdio_irq_thread;
350bbbc4c4d8c5face097d695f9bf3a39647ba6b7e7Nicolas Pitre	bool			sdio_irq_pending;
351d1496c39e500857b8949cdb91af24e0eb8aae4d0Nicolas Pitre	atomic_t		sdio_irq_thread_abort;
352d1496c39e500857b8949cdb91af24e0eb8aae4d0Nicolas Pitre
353da68c4eb258cd9f3f0b8aeb7e46b8118bb6358b6Nicolas Pitre	mmc_pm_flag_t		pm_flags;	/* requested pm features */
354da68c4eb258cd9f3f0b8aeb7e46b8118bb6358b6Nicolas Pitre
355af8350c756cb48a738474738f7bf8c0e572fa057Pierre Ossman	struct led_trigger	*led;		/* activity led */
356af8350c756cb48a738474738f7bf8c0e572fa057Pierre Ossman
35799fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij#ifdef CONFIG_REGULATOR
35899fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij	bool			regulator_enabled; /* regulator state */
35999fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij#endif
360e137788dd115dd9d21759a768dba5fff9685e587Guennadi Liakhovetski	struct mmc_supply	supply;
36199fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij
3626edd8ee60ac9b974bd6ec3b1bcb2aab02762fa8cHaavard Skinnemoen	struct dentry		*debugfs_root;
3636edd8ee60ac9b974bd6ec3b1bcb2aab02762fa8cHaavard Skinnemoen
364aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin	struct mmc_async_req	*areq;		/* active async req */
3652220eedfd7aea69008173a224975e10284fbe854Konstantin Dorfman	struct mmc_context_info	context_info;	/* async synchronization info */
366aa8b683a7d392271ed349c6ab9f36b8c313794b7Per Forlin
3671b676f70c108cda90cf9d114d16c677584400efcPer Forlin#ifdef CONFIG_FAIL_MMC_REQUEST
3681b676f70c108cda90cf9d114d16c677584400efcPer Forlin	struct fault_attr	fail_mmc_request;
3691b676f70c108cda90cf9d114d16c677584400efcPer Forlin#endif
3701b676f70c108cda90cf9d114d16c677584400efcPer Forlin
371df16219f365f7f5a2d88a6e123251d57255cca3fGiuseppe CAVALLARO	unsigned int		actual_clock;	/* Actual HC clock rate */
372df16219f365f7f5a2d88a6e123251d57255cca3fGiuseppe CAVALLARO
373eed222aca8d077af3600b651176f6fd04d95cce1Aaron Lu	unsigned int		slotno;	/* used for sdio acpi binding */
374eed222aca8d077af3600b651176f6fd04d95cce1Aaron Lu
3753d705d14fe4c72be83bae1610680e209ee226b9dSascha Hauer	int			dsr_req;	/* DSR value is valid */
3763d705d14fe4c72be83bae1610680e209ee226b9dSascha Hauer	u32			dsr;	/* optional driver stage (DSR) value */
3773d705d14fe4c72be83bae1610680e209ee226b9dSascha Hauer
378488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat#ifdef CONFIG_MMC_EMBEDDED_SDIO
379488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat	struct {
380488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat		struct sdio_cis			*cis;
381488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat		struct sdio_cccr		*cccr;
382488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat		struct sdio_embedded_func	*funcs;
383488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat		int				num_funcs;
384488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat	} embedded_sdio_data;
385488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat#endif
386488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat
38701357dcac62ac028de65a1c315eb75c530c8a5d6Russell King	unsigned long		private[0] ____cacheline_aligned;
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3908c9beb117bf31cdb757bc80992281004be8a177bGuennadi Liakhovetskistruct mmc_host *mmc_alloc_host(int extra, struct device *);
3918c9beb117bf31cdb757bc80992281004be8a177bGuennadi Liakhovetskiint mmc_add_host(struct mmc_host *);
3928c9beb117bf31cdb757bc80992281004be8a177bGuennadi Liakhovetskivoid mmc_remove_host(struct mmc_host *);
3938c9beb117bf31cdb757bc80992281004be8a177bGuennadi Liakhovetskivoid mmc_free_host(struct mmc_host *);
394ec0a7517dc25b4cca8a694fd61e09771bffba022Simon Baatzint mmc_of_parse(struct mmc_host *host);
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
396488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat#ifdef CONFIG_MMC_EMBEDDED_SDIO
397488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehatextern void mmc_set_embedded_sdio_data(struct mmc_host *host,
398488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat				       struct sdio_cis *cis,
399488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat				       struct sdio_cccr *cccr,
400488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat				       struct sdio_embedded_func *funcs,
401488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat				       int num_funcs);
402488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat#endif
403488ad4b90b85010d0a9e2924b3d46d8d6e5f40a5San Mehat
40401357dcac62ac028de65a1c315eb75c530c8a5d6Russell Kingstatic inline void *mmc_priv(struct mmc_host *host)
40501357dcac62ac028de65a1c315eb75c530c8a5d6Russell King{
40601357dcac62ac028de65a1c315eb75c530c8a5d6Russell King	return (void *)host->private;
40701357dcac62ac028de65a1c315eb75c530c8a5d6Russell King}
40801357dcac62ac028de65a1c315eb75c530c8a5d6Russell King
40997018580c40c8a31dd7ae744da3378c787a2066dDavid Brownell#define mmc_host_is_spi(host)	((host)->caps & MMC_CAP_SPI)
41097018580c40c8a31dd7ae744da3378c787a2066dDavid Brownell
411fcaf71fd51f9cfc504455d3e19ec242e4b2073edGreg Kroah-Hartman#define mmc_dev(x)	((x)->parent)
41211354d03afe9dd0d114e078057158baad4b4eee9Pierre Ossman#define mmc_classdev(x)	(&(x)->class_dev)
413d1b268630875a7713b5d468a0c03403c5b721c8eKay Sievers#define mmc_hostname(x)	(dev_name(&(x)->class_dev))
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4158c9beb117bf31cdb757bc80992281004be8a177bGuennadi Liakhovetskiint mmc_power_save_host(struct mmc_host *host);
4168c9beb117bf31cdb757bc80992281004be8a177bGuennadi Liakhovetskiint mmc_power_restore_host(struct mmc_host *host);
417eae1aeeed852aae37621b82a9e7f6c05096a18fdAdrian Hunter
4188c9beb117bf31cdb757bc80992281004be8a177bGuennadi Liakhovetskivoid mmc_detect_change(struct mmc_host *, unsigned long delay);
4198c9beb117bf31cdb757bc80992281004be8a177bGuennadi Liakhovetskivoid mmc_request_done(struct mmc_host *, struct mmc_request *);
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42117b759aff916b4d02721e75ce5ed82b1903e5bd6Nicolas Pitrestatic inline void mmc_signal_sdio_irq(struct mmc_host *host)
42217b759aff916b4d02721e75ce5ed82b1903e5bd6Nicolas Pitre{
42317b759aff916b4d02721e75ce5ed82b1903e5bd6Nicolas Pitre	host->ops->enable_sdio_irq(host, 0);
424bbbc4c4d8c5face097d695f9bf3a39647ba6b7e7Nicolas Pitre	host->sdio_irq_pending = true;
42517b759aff916b4d02721e75ce5ed82b1903e5bd6Nicolas Pitre	wake_up_process(host->sdio_irq_thread);
42617b759aff916b4d02721e75ce5ed82b1903e5bd6Nicolas Pitre}
42717b759aff916b4d02721e75ce5ed82b1903e5bd6Nicolas Pitre
428bf3b5ec66bd03d66e9ea729aaca013ea1047a797Russell Kingvoid sdio_run_irqs(struct mmc_host *host);
429bf3b5ec66bd03d66e9ea729aaca013ea1047a797Russell King
43099fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij#ifdef CONFIG_REGULATOR
4315c13941acc513669c7d07b28789c3f9ba66ddddfDavid Brownellint mmc_regulator_get_ocrmask(struct regulator *supply);
43299fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleijint mmc_regulator_set_ocr(struct mmc_host *mmc,
43399fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij			struct regulator *supply,
43499fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij			unsigned short vdd_bit);
43599fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij#else
43699fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleijstatic inline int mmc_regulator_get_ocrmask(struct regulator *supply)
43799fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij{
43899fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij	return 0;
43999fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij}
44099fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij
44199fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleijstatic inline int mmc_regulator_set_ocr(struct mmc_host *mmc,
44299fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij				 struct regulator *supply,
44399fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij				 unsigned short vdd_bit)
44499fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij{
44599fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij	return 0;
44699fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij}
44799fc5131018cbdc3cf42ce09fb394a4e8b053c74Linus Walleij#endif
4485c13941acc513669c7d07b28789c3f9ba66ddddfDavid Brownell
4494d1f52f9a9f9a63371dba589093b3ae90fc80c3dTim Krygerint mmc_regulator_get_supply(struct mmc_host *mmc);
4504d1f52f9a9f9a63371dba589093b3ae90fc80c3dTim Kryger
4514c2ef25fe0b847d2ae818f74758ddb0be1c27d8eMaxim Levitskyint mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *);
4528ea926b22e2d13238e4d65d8f61c48fe424e6f4fAdrian Hunter
45371d7d3d190fe77588269a8febf93cd739bd91eb3Matt Flemingstatic inline int mmc_card_is_removable(struct mmc_host *host)
45471d7d3d190fe77588269a8febf93cd739bd91eb3Matt Fleming{
4552501c9179dff2add6aadd3898cd729e94e777d3aUlf Hansson	return !(host->caps & MMC_CAP_NONREMOVABLE);
45671d7d3d190fe77588269a8febf93cd739bd91eb3Matt Fleming}
45771d7d3d190fe77588269a8febf93cd739bd91eb3Matt Fleming
458a5e9425d2010978c5f85986cc70a9fa0c0d5b912Ohad Ben-Cohenstatic inline int mmc_card_keep_power(struct mmc_host *host)
459080bc9774b6f1e3866747b18631bad26f47c22ceOhad Ben-Cohen{
460080bc9774b6f1e3866747b18631bad26f47c22ceOhad Ben-Cohen	return host->pm_flags & MMC_PM_KEEP_POWER;
461080bc9774b6f1e3866747b18631bad26f47c22ceOhad Ben-Cohen}
462080bc9774b6f1e3866747b18631bad26f47c22ceOhad Ben-Cohen
4636b93d01fe5971951911a070f51f412d50e9536dcOhad Ben-Cohenstatic inline int mmc_card_wake_sdio_irq(struct mmc_host *host)
4646b93d01fe5971951911a070f51f412d50e9536dcOhad Ben-Cohen{
4656b93d01fe5971951911a070f51f412d50e9536dcOhad Ben-Cohen	return host->pm_flags & MMC_PM_WAKE_SDIO_IRQ;
4666b93d01fe5971951911a070f51f412d50e9536dcOhad Ben-Cohen}
467d0c97cfb81ebc5b416c0f92fa2fc18d2773e3023Andrei Warkentin
468d0c97cfb81ebc5b416c0f92fa2fc18d2773e3023Andrei Warkentinstatic inline int mmc_host_cmd23(struct mmc_host *host)
469d0c97cfb81ebc5b416c0f92fa2fc18d2773e3023Andrei Warkentin{
470d0c97cfb81ebc5b416c0f92fa2fc18d2773e3023Andrei Warkentin	return host->caps & MMC_CAP_CMD23;
471d0c97cfb81ebc5b416c0f92fa2fc18d2773e3023Andrei Warkentin}
472f7c56ef2af5ae7e4c24c3c79427b38d18ba1d294Adrian Hunter
473f7c56ef2af5ae7e4c24c3c79427b38d18ba1d294Adrian Hunterstatic inline int mmc_boot_partition_access(struct mmc_host *host)
474f7c56ef2af5ae7e4c24c3c79427b38d18ba1d294Adrian Hunter{
475f7c56ef2af5ae7e4c24c3c79427b38d18ba1d294Adrian Hunter	return !(host->caps2 & MMC_CAP2_BOOTPART_NOACC);
476f7c56ef2af5ae7e4c24c3c79427b38d18ba1d294Adrian Hunter}
477f7c56ef2af5ae7e4c24c3c79427b38d18ba1d294Adrian Hunter
47841875e388401ad97c33252d5fa39d52e0b70ee9bSujit Reddy Thummastatic inline int mmc_host_uhs(struct mmc_host *host)
47941875e388401ad97c33252d5fa39d52e0b70ee9bSujit Reddy Thumma{
48041875e388401ad97c33252d5fa39d52e0b70ee9bSujit Reddy Thumma	return host->caps &
48141875e388401ad97c33252d5fa39d52e0b70ee9bSujit Reddy Thumma		(MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 |
48241875e388401ad97c33252d5fa39d52e0b70ee9bSujit Reddy Thumma		 MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 |
48341875e388401ad97c33252d5fa39d52e0b70ee9bSujit Reddy Thumma		 MMC_CAP_UHS_DDR50);
48441875e388401ad97c33252d5fa39d52e0b70ee9bSujit Reddy Thumma}
48541875e388401ad97c33252d5fa39d52e0b70ee9bSujit Reddy Thumma
486ce39f9d17c14e56ea6772aa84393e6e0cc8499c4Seungwon Jeonstatic inline int mmc_host_packed_wr(struct mmc_host *host)
487ce39f9d17c14e56ea6772aa84393e6e0cc8499c4Seungwon Jeon{
488ce39f9d17c14e56ea6772aa84393e6e0cc8499c4Seungwon Jeon	return host->caps2 & MMC_CAP2_PACKED_WR;
489ce39f9d17c14e56ea6772aa84393e6e0cc8499c4Seungwon Jeon}
490ce39f9d17c14e56ea6772aa84393e6e0cc8499c4Seungwon Jeon
4912c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma#ifdef CONFIG_MMC_CLKGATE
4922c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thummavoid mmc_host_clk_hold(struct mmc_host *host);
4932c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thummavoid mmc_host_clk_release(struct mmc_host *host);
4942c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thummaunsigned int mmc_host_clk_rate(struct mmc_host *host);
4952c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma
4962c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma#else
4972c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thummastatic inline void mmc_host_clk_hold(struct mmc_host *host)
4982c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma{
4992c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma}
5002c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma
5012c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thummastatic inline void mmc_host_clk_release(struct mmc_host *host)
5022c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma{
5032c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma}
5042c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma
5052c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thummastatic inline unsigned int mmc_host_clk_rate(struct mmc_host *host)
5062c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma{
5072c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma	return host->ios.clock;
5082c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma}
5092c4967f741e87cdd63de7271b97807041dccbf3bSujit Reddy Thumma#endif
510cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon
511cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeonstatic inline int mmc_card_hs(struct mmc_card *card)
512cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon{
513cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon	return card->host->ios.timing == MMC_TIMING_SD_HS ||
514cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon		card->host->ios.timing == MMC_TIMING_MMC_HS;
515cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon}
516cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon
517cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeonstatic inline int mmc_card_uhs(struct mmc_card *card)
518cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon{
519cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon	return card->host->ios.timing >= MMC_TIMING_UHS_SDR12 &&
520cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon		card->host->ios.timing <= MMC_TIMING_UHS_DDR50;
521cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon}
522cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon
523cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeonstatic inline bool mmc_card_hs200(struct mmc_card *card)
524cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon{
525cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon	return card->host->ios.timing == MMC_TIMING_MMC_HS200;
526cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon}
527cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon
528cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeonstatic inline bool mmc_card_ddr52(struct mmc_card *card)
529cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon{
530cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon	return card->host->ios.timing == MMC_TIMING_MMC_DDR52;
531cdc991790c51c693d0c347a5286af017826a5d01Seungwon Jeon}
5320a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon
5330a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeonstatic inline bool mmc_card_hs400(struct mmc_card *card)
5340a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon{
5350a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon	return card->host->ios.timing == MMC_TIMING_MMC_HS400;
5360a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon}
5370a5b6438ee482696360bb013e67b8488f63d3e9eSeungwon Jeon
538100e918610b7487fa18db97b3879cd8d1fdd5974Robert P. J. Day#endif /* LINUX_MMC_HOST_H */
539