Blame view

include/dwmmc.h 4.83 KB
757bff49b   Jaehoon Chung   mmc: dw-mmc: supp...
1
2
3
4
  /*
   * (C) Copyright 2012 SAMSUNG Electronics
   * Jaehoon Chung <jh80.chung@samsung.com>
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
757bff49b   Jaehoon Chung   mmc: dw-mmc: supp...
6
7
8
9
10
11
12
13
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
   */
  
  #ifndef __DWMMC_HW_H
  #define __DWMMC_HW_H
  
  #include <asm/io.h>
  #include <mmc.h>
  
  #define DWMCI_CTRL		0x000
  #define	DWMCI_PWREN		0x004
  #define DWMCI_CLKDIV		0x008
  #define DWMCI_CLKSRC		0x00C
  #define DWMCI_CLKENA		0x010
  #define DWMCI_TMOUT		0x014
  #define DWMCI_CTYPE		0x018
  #define DWMCI_BLKSIZ		0x01C
  #define DWMCI_BYTCNT		0x020
  #define DWMCI_INTMASK		0x024
  #define DWMCI_CMDARG		0x028
  #define DWMCI_CMD		0x02C
  #define DWMCI_RESP0		0x030
  #define DWMCI_RESP1		0x034
  #define DWMCI_RESP2		0x038
  #define DWMCI_RESP3		0x03C
  #define DWMCI_MINTSTS		0x040
  #define DWMCI_RINTSTS		0x044
  #define DWMCI_STATUS		0x048
  #define DWMCI_FIFOTH		0x04C
  #define DWMCI_CDETECT		0x050
  #define DWMCI_WRTPRT		0x054
  #define DWMCI_GPIO		0x058
  #define DWMCI_TCMCNT		0x05C
  #define DWMCI_TBBCNT		0x060
  #define DWMCI_DEBNCE		0x064
  #define DWMCI_USRID		0x068
  #define DWMCI_VERID		0x06C
  #define DWMCI_HCON		0x070
  #define DWMCI_UHS_REG		0x074
  #define DWMCI_BMOD		0x080
  #define DWMCI_PLDMND		0x084
  #define DWMCI_DBADDR		0x088
  #define DWMCI_IDSTS		0x08C
  #define DWMCI_IDINTEN		0x090
  #define DWMCI_DSCADDR		0x094
  #define DWMCI_BUFADDR		0x098
  #define DWMCI_DATA		0x200
  
  /* Interrupt Mask register */
  #define DWMCI_INTMSK_ALL	0xffffffff
  #define DWMCI_INTMSK_RE		(1 << 1)
  #define DWMCI_INTMSK_CDONE	(1 << 2)
  #define DWMCI_INTMSK_DTO	(1 << 3)
  #define DWMCI_INTMSK_TXDR	(1 << 4)
  #define DWMCI_INTMSK_RXDR	(1 << 5)
  #define DWMCI_INTMSK_DCRC	(1 << 7)
  #define DWMCI_INTMSK_RTO	(1 << 8)
  #define DWMCI_INTMSK_DRTO	(1 << 9)
  #define DWMCI_INTMSK_HTO	(1 << 10)
  #define DWMCI_INTMSK_FRUN	(1 << 11)
  #define DWMCI_INTMSK_HLE	(1 << 12)
  #define DWMCI_INTMSK_SBE	(1 << 13)
  #define DWMCI_INTMSK_ACD	(1 << 14)
  #define DWMCI_INTMSK_EBE	(1 << 15)
  
  /* Raw interrupt Regsiter */
  #define DWMCI_DATA_ERR	(DWMCI_INTMSK_EBE | DWMCI_INTMSK_SBE | DWMCI_INTMSK_HLE |\
  			DWMCI_INTMSK_FRUN | DWMCI_INTMSK_EBE | DWMCI_INTMSK_DCRC)
  #define DWMCI_DATA_TOUT	(DWMCI_INTMSK_HTO | DWMCI_INTMSK_DRTO)
  /* CTRL register */
  #define DWMCI_CTRL_RESET	(1 << 0)
  #define DWMCI_CTRL_FIFO_RESET	(1 << 1)
  #define DWMCI_CTRL_DMA_RESET	(1 << 2)
  #define DWMCI_DMA_EN		(1 << 5)
  #define DWMCI_CTRL_SEND_AS_CCSD	(1 << 10)
  #define DWMCI_IDMAC_EN		(1 << 25)
  #define DWMCI_RESET_ALL		(DWMCI_CTRL_RESET | DWMCI_CTRL_FIFO_RESET |\
  				DWMCI_CTRL_DMA_RESET)
  
  /* CMD register */
  #define DWMCI_CMD_RESP_EXP	(1 << 6)
  #define DWMCI_CMD_RESP_LENGTH	(1 << 7)
  #define DWMCI_CMD_CHECK_CRC	(1 << 8)
  #define DWMCI_CMD_DATA_EXP	(1 << 9)
  #define DWMCI_CMD_RW		(1 << 10)
  #define DWMCI_CMD_SEND_STOP	(1 << 12)
  #define DWMCI_CMD_ABORT_STOP	(1 << 14)
  #define DWMCI_CMD_PRV_DAT_WAIT	(1 << 13)
  #define DWMCI_CMD_UPD_CLK	(1 << 21)
  #define DWMCI_CMD_USE_HOLD_REG	(1 << 29)
  #define DWMCI_CMD_START		(1 << 31)
  
  /* CLKENA register */
  #define DWMCI_CLKEN_ENABLE	(1 << 0)
  #define DWMCI_CLKEN_LOW_PWR	(1 << 16)
  
  /* Card-type registe */
  #define DWMCI_CTYPE_1BIT	0
  #define DWMCI_CTYPE_4BIT	(1 << 0)
  #define DWMCI_CTYPE_8BIT	(1 << 16)
  
  /* Status Register */
  #define DWMCI_BUSY		(1 << 9)
  
  /* FIFOTH Register */
  #define MSIZE(x)		((x) << 28)
  #define RX_WMARK(x)		((x) << 16)
  #define TX_WMARK(x)		(x)
a082a2dde   Amar   EXYNOS5: DWMMC: A...
113
114
  #define RX_WMARK_SHIFT		16
  #define RX_WMARK_MASK		(0xfff << RX_WMARK_SHIFT)
757bff49b   Jaehoon Chung   mmc: dw-mmc: supp...
115
116
117
118
119
120
121
122
123
124
  
  #define DWMCI_IDMAC_OWN		(1 << 31)
  #define DWMCI_IDMAC_CH		(1 << 4)
  #define DWMCI_IDMAC_FS		(1 << 3)
  #define DWMCI_IDMAC_LD		(1 << 2)
  
  /*  Bus Mode Register */
  #define DWMCI_BMOD_IDMAC_RESET	(1 << 0)
  #define DWMCI_BMOD_IDMAC_FB	(1 << 1)
  #define DWMCI_BMOD_IDMAC_EN	(1 << 7)
045bdcd0b   Jaehoon Chung   mmc: dw_mmc: supp...
125
126
  /* UHS register */
  #define DWMCI_DDR_MODE	(1 << 16)
6f0b7caa6   Rajeshwari Shinde   DWMMC: SMDK5420: ...
127
128
  /* quirks */
  #define DWMCI_QUIRK_DISABLE_SMU		(1 << 0)
757bff49b   Jaehoon Chung   mmc: dw-mmc: supp...
129
130
131
132
133
134
135
136
  struct dwmci_host {
  	char *name;
  	void *ioaddr;
  	unsigned int quirks;
  	unsigned int caps;
  	unsigned int version;
  	unsigned int clock;
  	unsigned int bus_hz;
959198f7c   Jaehoon Chung   mmc: exynos_dw_mm...
137
  	unsigned int div;
757bff49b   Jaehoon Chung   mmc: dw-mmc: supp...
138
  	int dev_index;
959198f7c   Jaehoon Chung   mmc: exynos_dw_mm...
139
  	int dev_id;
757bff49b   Jaehoon Chung   mmc: dw-mmc: supp...
140
141
142
  	int buswidth;
  	u32 fifoth_val;
  	struct mmc *mmc;
5dab81cea   Jaehoon Chung   mmc: exynos_dw_mm...
143
  	void *priv;
757bff49b   Jaehoon Chung   mmc: dw-mmc: supp...
144
145
  
  	void (*clksel)(struct dwmci_host *host);
18ab67559   Jaehoon Chung   mmc: dw_mmc: remo...
146
  	void (*board_init)(struct dwmci_host *host);
d3e016cc2   Rajeshwari S Shinde   MMC: DWMMC: Corre...
147
  	unsigned int (*get_mmc_clk)(struct dwmci_host *host);
93bfd6167   Pantelis Antoniou   mmc: Split mmc st...
148
149
  
  	struct mmc_config cfg;
757bff49b   Jaehoon Chung   mmc: dw-mmc: supp...
150
151
152
153
154
155
156
  };
  
  struct dwmci_idmac {
  	u32 flags;
  	u32 cnt;
  	u32 addr;
  	u32 next_addr;
1bf29b3d5   Marek Vasut   mmc: dw_mmc: Fix ...
157
  } __aligned(ARCH_DMA_MINALIGN);
757bff49b   Jaehoon Chung   mmc: dw-mmc: supp...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
  
  static inline void dwmci_writel(struct dwmci_host *host, int reg, u32 val)
  {
  	writel(val, host->ioaddr + reg);
  }
  
  static inline void dwmci_writew(struct dwmci_host *host, int reg, u16 val)
  {
  	writew(val, host->ioaddr + reg);
  }
  
  static inline void dwmci_writeb(struct dwmci_host *host, int reg, u8 val)
  {
  	writeb(val, host->ioaddr + reg);
  }
  static inline u32 dwmci_readl(struct dwmci_host *host, int reg)
  {
  	return readl(host->ioaddr + reg);
  }
  
  static inline u16 dwmci_readw(struct dwmci_host *host, int reg)
  {
  	return readw(host->ioaddr + reg);
  }
  
  static inline u8 dwmci_readb(struct dwmci_host *host, int reg)
  {
  	return readb(host->ioaddr + reg);
  }
  
  int add_dwmci(struct dwmci_host *host, u32 max_clk, u32 min_clk);
  #endif	/* __DWMMC_HW_H */