1/*-
2 * Copyright (c) 2011-2012 Semihalf
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: releng/10.3/sys/powerpc/mpc85xx/fsl_sdhc.h 236121 2012-05-26 21:07:15Z raj $
27 */
28
29#ifndef FSL_SDHC_H_
30#define FSL_SDHC_H_
31
32#include <sys/cdefs.h>
33
34#include <sys/param.h>
35#include <sys/bus.h>
36#include <sys/kernel.h>
37#include <sys/lock.h>
38#include <sys/module.h>
39#include <sys/mutex.h>
40#include <sys/rman.h>
41#include <sys/sysctl.h>
42#include <sys/systm.h>
43#include <sys/taskqueue.h>
44
45#include <machine/bus.h>
46
47#include <dev/mmc/bridge.h>
48#include <dev/mmc/mmcreg.h>
49#include <dev/mmc/mmcvar.h>
50#include <dev/mmc/mmcbrvar.h>
51
52#include "mmcbr_if.h"
53
54
55/*****************************************************************************
56 * Private defines
57 *****************************************************************************/
58struct slot {
59	uint32_t	clock;
60};
61
62struct fsl_sdhc_softc {
63	device_t		self;
64	device_t		child;
65
66	bus_space_handle_t	bsh;
67	bus_space_tag_t		bst;
68
69	struct resource		*mem_resource;
70	int			mem_rid;
71	struct resource		*irq_resource;
72	int			irq_rid;
73	void			*ihl;
74
75	bus_dma_tag_t		dma_tag;
76	bus_dmamap_t		dma_map;
77	uint32_t*		dma_mem;
78	bus_addr_t		dma_phys;
79
80	struct mtx		mtx;
81
82	struct task		card_detect_task;
83	struct callout		card_detect_callout;
84
85	struct mmc_host		mmc_host;
86
87	struct slot		slot;
88	uint32_t		bus_busy;
89	uint32_t		platform_clock;
90
91	struct mmc_request	*request;
92	int			data_done;
93	int			command_done;
94	int			use_dma;
95	uint32_t*		data_ptr;
96	uint32_t		data_offset;
97};
98
99#define FSL_SDHC_RESET_DELAY 50
100
101#define	FSL_SDHC_BASE_CLOCK_DIV		(2)
102#define	FSL_SDHC_MAX_DIV		(FSL_SDHC_BASE_CLOCK_DIV * 256 * 16)
103#define	FSL_SDHC_MIN_DIV		(FSL_SDHC_BASE_CLOCK_DIV * 2)
104#define	FSL_SDHC_MAX_CLOCK		(50000000)
105
106#define	FSL_SDHC_MAX_BLOCK_COUNT	(65535)
107#define	FSL_SDHC_MAX_BLOCK_SIZE		(4096)
108
109#define FSL_SDHC_FIFO_BUF_SIZE		(64)	/* Water-mark level. */
110#define FSL_SDHC_FIFO_BUF_WORDS		(FSL_SDHC_FIFO_BUF_SIZE / 4)
111
112#define FSL_SDHC_DMA_SEGMENT_SIZE	(1024)
113#define	FSL_SDHC_DMA_ALIGNMENT		(4)
114#define	FSL_SDHC_DMA_BLOCK_SIZE		FSL_SDHC_MAX_BLOCK_SIZE
115
116
117/*
118 * Offsets of SD HC registers
119 */
120enum sdhc_reg_off {
121	SDHC_DSADDR	= 0x000,
122	SDHC_BLKATTR	= 0x004,
123	SDHC_CMDARG	= 0x008,
124	SDHC_XFERTYP	= 0x00c,
125	SDHC_CMDRSP0	= 0x010,
126	SDHC_CMDRSP1	= 0x014,
127	SDHC_CMDRSP2	= 0x018,
128	SDHC_CMDRSP3	= 0x01c,
129	SDHC_DATPORT	= 0x020,
130	SDHC_PRSSTAT	= 0x024,
131	SDHC_PROCTL	= 0x028,
132	SDHC_SYSCTL	= 0x02c,
133	SDHC_IRQSTAT	= 0x030,
134	SDHC_IRQSTATEN	= 0x034,
135	SDHC_IRQSIGEN	= 0x038,
136	SDHC_AUTOC12ERR	= 0x03c,
137	SDHC_HOSTCAPBLT	= 0x040,
138	SDHC_WML	= 0x044,
139	SDHC_FEVT	= 0x050,
140	SDHC_HOSTVER	= 0x0fc,
141	SDHC_DCR	= 0x40c
142};
143
144enum sysctl_bit {
145	SYSCTL_INITA	= 0x08000000,
146	SYSCTL_RSTD	= 0x04000000,
147	SYSCTL_RSTC	= 0x02000000,
148	SYSCTL_RSTA	= 0x01000000,
149	SYSCTL_DTOCV	= 0x000f0000,
150	SYSCTL_SDCLKFS	= 0x0000ff00,
151	SYSCTL_DVS	= 0x000000f0,
152	SYSCTL_PEREN	= 0x00000004,
153	SYSCTL_HCKEN	= 0x00000002,
154	SYSCTL_IPGEN	= 0x00000001
155};
156
157#define HEX_LEFT_SHIFT(x)	(4 * x)
158enum sysctl_shift {
159	SHIFT_DTOCV	= HEX_LEFT_SHIFT(4),
160	SHIFT_SDCLKFS	= HEX_LEFT_SHIFT(2),
161	SHIFT_DVS	= HEX_LEFT_SHIFT(1)
162};
163
164enum proctl_bit {
165	PROCTL_WECRM	= 0x04000000,
166	PROCTL_WECINS	= 0x02000000,
167	PROCTL_WECINT	= 0x01000000,
168	PROCTL_RWCTL	= 0x00040000,
169	PROCTL_CREQ	= 0x00020000,
170	PROCTL_SABGREQ	= 0x00010000,
171	PROCTL_CDSS	= 0x00000080,
172	PROCTL_CDTL	= 0x00000040,
173	PROCTL_EMODE	= 0x00000030,
174	PROCTL_D3CD	= 0x00000008,
175	PROCTL_DTW	= 0x00000006
176};
177
178enum dtw {
179	DTW_1	= 0x00000000,
180	DTW_4	= 0x00000002,
181	DTW_8	= 0x00000004
182};
183
184enum prsstat_bit {
185	PRSSTAT_DLSL	= 0xff000000,
186	PRSSTAT_CLSL	= 0x00800000,
187	PRSSTAT_WPSPL	= 0x00080000,
188	PRSSTAT_CDPL	= 0x00040000,
189	PRSSTAT_CINS	= 0x00010000,
190	PRSSTAT_BREN	= 0x00000800,
191	PRSSTAT_BWEN	= 0x00000400,
192	PRSSTAT_RTA	= 0x00000200,
193	PRSSTAT_WTA	= 0x00000100,
194	PRSSTAT_SDOFF	= 0x00000080,
195	PRSSTAT_PEROFF	= 0x00000040,
196	PRSSTAT_HCKOFF	= 0x00000020,
197	PRSSTAT_IPGOFF	= 0x00000010,
198	PRSSTAT_DLA	= 0x00000004,
199	PRSSTAT_CDIHB	= 0x00000002,
200	PRSSTAT_CIHB	= 0x00000001
201
202};
203
204enum irq_bits {
205	IRQ_DMAE	= 0x10000000,
206	IRQ_AC12E	= 0x01000000,
207	IRQ_DEBE	= 0x00400000,
208	IRQ_DCE		= 0x00200000,
209	IRQ_DTOE	= 0x00100000,
210	IRQ_CIE		= 0x00080000,
211	IRQ_CEBE	= 0x00040000,
212	IRQ_CCE		= 0x00020000,
213	IRQ_CTOE	= 0x00010000,
214	IRQ_CINT	= 0x00000100,
215	IRQ_CRM		= 0x00000080,
216	IRQ_CINS	= 0x00000040,
217	IRQ_BRR		= 0x00000020,
218	IRQ_BWR		= 0x00000010,
219	IRQ_DINT	= 0x00000008,
220	IRQ_BGE		= 0x00000004,
221	IRQ_TC		= 0x00000002,
222	IRQ_CC		= 0x00000001
223};
224
225enum irq_masks {
226	IRQ_ERROR_DATA_MASK	= IRQ_DMAE | IRQ_DEBE | IRQ_DCE | IRQ_DTOE,
227	IRQ_ERROR_CMD_MASK	= IRQ_AC12E | IRQ_CIE | IRQ_CTOE | IRQ_CCE |
228				  IRQ_CEBE
229};
230
231enum dcr_bits {
232	DCR_PRI			= 0x0000c000,
233	DCR_SNOOP		= 0x00000040,
234	DCR_AHB2MAG_BYPASS	= 0x00000020,
235	DCR_RD_SAFE		= 0x00000004,
236	DCR_RD_PFE		= 0x00000002,
237	DCR_RD_PF_SIZE		= 0x00000001
238};
239
240#define	DCR_PRI_SHIFT	(14)
241
242enum xfertyp_bits {
243	XFERTYP_CMDINX	= 0x3f000000,
244	XFERTYP_CMDTYP	= 0x00c00000,
245	XFERTYP_DPSEL	= 0x00200000,
246	XFERTYP_CICEN	= 0x00100000,
247	XFERTYP_CCCEN	= 0x00080000,
248	XFERTYP_RSPTYP	= 0x00030000,
249	XFERTYP_MSBSEL	= 0x00000020,
250	XFERTYP_DTDSEL	= 0x00000010,
251	XFERTYP_AC12EN	= 0x00000004,
252	XFERTYP_BCEN	= 0x00000002,
253	XFERTYP_DMAEN	= 0x00000001
254};
255
256#define	CMDINX_SHIFT	(24)
257
258enum xfertyp_cmdtyp {
259	CMDTYP_NORMAL	= 0x00000000,
260	CMDYTP_SUSPEND	= 0x00400000,
261	CMDTYP_RESUME	= 0x00800000,
262	CMDTYP_ABORT	= 0x00c00000
263};
264
265enum xfertyp_rsptyp {
266	RSPTYP_NONE	= 0x00000000,
267	RSPTYP_136	= 0x00010000,
268	RSPTYP_48	= 0x00020000,
269	RSPTYP_48_BUSY	= 0x00030000
270};
271
272enum blkattr_bits {
273	BLKATTR_BLKSZE	= 0x00001fff,
274	BLKATTR_BLKCNT	= 0xffff0000
275};
276#define	BLKATTR_BLOCK_COUNT(x)	(x << 16)
277
278enum wml_bits {
279	WR_WML	= 0x00ff0000,
280	RD_WML	= 0x000000ff,
281};
282
283enum sdhc_bit_mask {
284	MASK_CLOCK_CONTROL	= 0x0000ffff,
285	MASK_IRQ_ALL		= IRQ_DMAE | IRQ_AC12E | IRQ_DEBE | IRQ_DCE |
286				  IRQ_DTOE | IRQ_CIE | IRQ_CEBE | IRQ_CCE |
287				  IRQ_CTOE | IRQ_CINT | IRQ_CRM | IRQ_CINS |
288				  IRQ_BRR | IRQ_BWR | IRQ_DINT | IRQ_BGE |
289				  IRQ_TC | IRQ_CC,
290};
291
292enum sdhc_line {
293	SDHC_DAT_LINE	= 0x2,
294	SDHC_CMD_LINE	= 0x1
295};
296
297#endif /* FSL_SDHC_H_ */
298