host.h 5.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12
/*
 *  linux/include/linux/mmc/host.h
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 *  Host driver specific definitions.
 */
#ifndef LINUX_MMC_HOST_H
#define LINUX_MMC_HOST_H

13
#include <linux/mmc/core.h>
L
Linus Torvalds 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

struct mmc_ios {
	unsigned int	clock;			/* clock rate */
	unsigned short	vdd;

#define	MMC_VDD_150	0
#define	MMC_VDD_155	1
#define	MMC_VDD_160	2
#define	MMC_VDD_165	3
#define	MMC_VDD_170	4
#define	MMC_VDD_180	5
#define	MMC_VDD_190	6
#define	MMC_VDD_200	7
#define	MMC_VDD_210	8
#define	MMC_VDD_220	9
#define	MMC_VDD_230	10
#define	MMC_VDD_240	11
#define	MMC_VDD_250	12
#define	MMC_VDD_260	13
#define	MMC_VDD_270	14
#define	MMC_VDD_280	15
#define	MMC_VDD_290	16
#define	MMC_VDD_300	17
#define	MMC_VDD_310	18
#define	MMC_VDD_320	19
#define	MMC_VDD_330	20
#define	MMC_VDD_340	21
#define	MMC_VDD_350	22
#define	MMC_VDD_360	23

	unsigned char	bus_mode;		/* command output mode */

#define MMC_BUSMODE_OPENDRAIN	1
#define MMC_BUSMODE_PUSHPULL	2

P
Pierre Ossman 已提交
49 50 51 52 53 54
	unsigned char	chip_select;		/* SPI chip select */

#define MMC_CS_DONTCARE		0
#define MMC_CS_HIGH		1
#define MMC_CS_LOW		2

L
Linus Torvalds 已提交
55 56 57 58 59
	unsigned char	power_mode;		/* power supply mode */

#define MMC_POWER_OFF		0
#define MMC_POWER_UP		1
#define MMC_POWER_ON		2
P
Pierre Ossman 已提交
60 61 62 63 64

	unsigned char	bus_width;		/* data bus width */

#define MMC_BUS_WIDTH_1		0
#define MMC_BUS_WIDTH_4		2
65 66 67 68 69 70

	unsigned char	timing;			/* timing specification used */

#define MMC_TIMING_LEGACY	0
#define MMC_TIMING_MMC_HS	1
#define MMC_TIMING_SD_HS	2
L
Linus Torvalds 已提交
71 72 73 74 75
};

struct mmc_host_ops {
	void	(*request)(struct mmc_host *host, struct mmc_request *req);
	void	(*set_ios)(struct mmc_host *host, struct mmc_ios *ios);
P
Pierre Ossman 已提交
76
	int	(*get_ro)(struct mmc_host *host);
L
Linus Torvalds 已提交
77 78 79 80 81 82
};

struct mmc_card;
struct device;

struct mmc_host {
83 84
	struct device		*parent;
	struct device		class_dev;
85
	int			index;
D
David Brownell 已提交
86
	const struct mmc_host_ops *ops;
L
Linus Torvalds 已提交
87 88 89 90
	unsigned int		f_min;
	unsigned int		f_max;
	u32			ocr_avail;

P
Pierre Ossman 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
#define MMC_VDD_145_150		0x00000001	/* VDD voltage 1.45 - 1.50 */
#define MMC_VDD_150_155		0x00000002	/* VDD voltage 1.50 - 1.55 */
#define MMC_VDD_155_160		0x00000004	/* VDD voltage 1.55 - 1.60 */
#define MMC_VDD_160_165		0x00000008	/* VDD voltage 1.60 - 1.65 */
#define MMC_VDD_165_170		0x00000010	/* VDD voltage 1.65 - 1.70 */
#define MMC_VDD_17_18		0x00000020	/* VDD voltage 1.7 - 1.8 */
#define MMC_VDD_18_19		0x00000040	/* VDD voltage 1.8 - 1.9 */
#define MMC_VDD_19_20		0x00000080	/* VDD voltage 1.9 - 2.0 */
#define MMC_VDD_20_21		0x00000100	/* VDD voltage 2.0 ~ 2.1 */
#define MMC_VDD_21_22		0x00000200	/* VDD voltage 2.1 ~ 2.2 */
#define MMC_VDD_22_23		0x00000400	/* VDD voltage 2.2 ~ 2.3 */
#define MMC_VDD_23_24		0x00000800	/* VDD voltage 2.3 ~ 2.4 */
#define MMC_VDD_24_25		0x00001000	/* VDD voltage 2.4 ~ 2.5 */
#define MMC_VDD_25_26		0x00002000	/* VDD voltage 2.5 ~ 2.6 */
#define MMC_VDD_26_27		0x00004000	/* VDD voltage 2.6 ~ 2.7 */
#define MMC_VDD_27_28		0x00008000	/* VDD voltage 2.7 ~ 2.8 */
#define MMC_VDD_28_29		0x00010000	/* VDD voltage 2.8 ~ 2.9 */
#define MMC_VDD_29_30		0x00020000	/* VDD voltage 2.9 ~ 3.0 */
#define MMC_VDD_30_31		0x00040000	/* VDD voltage 3.0 ~ 3.1 */
#define MMC_VDD_31_32		0x00080000	/* VDD voltage 3.1 ~ 3.2 */
#define MMC_VDD_32_33		0x00100000	/* VDD voltage 3.2 ~ 3.3 */
#define MMC_VDD_33_34		0x00200000	/* VDD voltage 3.3 ~ 3.4 */
#define MMC_VDD_34_35		0x00400000	/* VDD voltage 3.4 ~ 3.5 */
#define MMC_VDD_35_36		0x00800000	/* VDD voltage 3.5 ~ 3.6 */

P
Pierre Ossman 已提交
116 117 118
	unsigned long		caps;		/* Host capabilities */

#define MMC_CAP_4_BIT_DATA	(1 << 0)	/* Can the host do 4 bit transfers */
119
#define MMC_CAP_MULTIWRITE	(1 << 1)	/* Can accurately report bytes sent to card on error */
120
#define MMC_CAP_BYTEBLOCK	(1 << 2)	/* Can do non-log2 block sizes */
121 122
#define MMC_CAP_MMC_HIGHSPEED	(1 << 3)	/* Can do MMC high-speed timing */
#define MMC_CAP_SD_HIGHSPEED	(1 << 4)	/* Can do SD high-speed timing */
P
Pierre Ossman 已提交
123

L
Linus Torvalds 已提交
124 125 126 127 128
	/* host specific block data */
	unsigned int		max_seg_size;	/* see blk_queue_max_segment_size */
	unsigned short		max_hw_segs;	/* see blk_queue_max_hw_segments */
	unsigned short		max_phys_segs;	/* see blk_queue_max_phys_segments */
	unsigned short		unused;
129
	unsigned int		max_req_size;	/* maximum number of bytes in one req */
130
	unsigned int		max_blk_size;	/* maximum size of one mmc block */
131
	unsigned int		max_blk_count;	/* maximum number of blocks in one req */
L
Linus Torvalds 已提交
132 133

	/* private data */
P
Pierre Ossman 已提交
134 135
	spinlock_t		lock;		/* lock for claim and bus ops */

L
Linus Torvalds 已提交
136 137 138
	struct mmc_ios		ios;		/* current io bus settings */
	u32			ocr;		/* the current OCR setting */

P
Pierre Ossman 已提交
139 140 141 142
	unsigned int		mode;		/* current card mode of host */
#define MMC_MODE_MMC		0
#define MMC_MODE_SD		1

P
Pierre Ossman 已提交
143
	struct mmc_card		*card;		/* device attached to this host */
L
Linus Torvalds 已提交
144 145

	wait_queue_head_t	wq;
P
Pierre Ossman 已提交
146 147
	unsigned int		claimed:1;	/* host exclusively claimed */

D
David Howells 已提交
148
	struct delayed_work	detect;
149 150 151
#ifdef CONFIG_MMC_DEBUG
	unsigned int		removed:1;	/* host is being removed */
#endif
152

P
Pierre Ossman 已提交
153 154 155 156
	const struct mmc_bus_ops *bus_ops;	/* current bus driver */
	unsigned int		bus_refs;	/* reference counter */
	unsigned int		bus_dead:1;	/* bus has been released */

157
	unsigned long		private[0] ____cacheline_aligned;
L
Linus Torvalds 已提交
158 159 160 161 162 163 164
};

extern struct mmc_host *mmc_alloc_host(int extra, struct device *);
extern int mmc_add_host(struct mmc_host *);
extern void mmc_remove_host(struct mmc_host *);
extern void mmc_free_host(struct mmc_host *);

165 166 167 168 169
static inline void *mmc_priv(struct mmc_host *host)
{
	return (void *)host->private;
}

170
#define mmc_dev(x)	((x)->parent)
P
Pierre Ossman 已提交
171
#define mmc_classdev(x)	(&(x)->class_dev)
172
#define mmc_hostname(x)	((x)->class_dev.bus_id)
L
Linus Torvalds 已提交
173

174
extern int mmc_suspend_host(struct mmc_host *, pm_message_t);
L
Linus Torvalds 已提交
175 176
extern int mmc_resume_host(struct mmc_host *);

177
extern void mmc_detect_change(struct mmc_host *, unsigned long delay);
L
Linus Torvalds 已提交
178 179 180 181
extern void mmc_request_done(struct mmc_host *, struct mmc_request *);

#endif