xref: /OK3568_Linux_fs/kernel/drivers/mmc/host/cavium.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Driver for MMC and SSD cards for Cavium OCTEON and ThunderX SOCs.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * This file is subject to the terms and conditions of the GNU General Public
5*4882a593Smuzhiyun  * License.  See the file "COPYING" in the main directory of this archive
6*4882a593Smuzhiyun  * for more details.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Copyright (C) 2012-2017 Cavium Inc.
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #ifndef _CAVIUM_MMC_H_
12*4882a593Smuzhiyun #define _CAVIUM_MMC_H_
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/bitops.h>
15*4882a593Smuzhiyun #include <linux/clk.h>
16*4882a593Smuzhiyun #include <linux/gpio/consumer.h>
17*4882a593Smuzhiyun #include <linux/io.h>
18*4882a593Smuzhiyun #include <linux/mmc/host.h>
19*4882a593Smuzhiyun #include <linux/of.h>
20*4882a593Smuzhiyun #include <linux/scatterlist.h>
21*4882a593Smuzhiyun #include <linux/semaphore.h>
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define CAVIUM_MAX_MMC		4
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun /* DMA register addresses */
26*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CFG(x)	(0x00 + x->reg_off_dma)
27*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_ADR(x)	(0x10 + x->reg_off_dma)
28*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD(x)	(0x18 + x->reg_off_dma)
29*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG(x)	(0x20 + x->reg_off_dma)
30*4882a593Smuzhiyun #define MIO_EMM_DMA_ADR(x)	(0x28 + x->reg_off_dma)
31*4882a593Smuzhiyun #define MIO_EMM_DMA_INT(x)	(0x30 + x->reg_off_dma)
32*4882a593Smuzhiyun #define MIO_EMM_DMA_INT_W1S(x)	(0x38 + x->reg_off_dma)
33*4882a593Smuzhiyun #define MIO_EMM_DMA_INT_ENA_W1S(x) (0x40 + x->reg_off_dma)
34*4882a593Smuzhiyun #define MIO_EMM_DMA_INT_ENA_W1C(x) (0x48 + x->reg_off_dma)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* register addresses */
37*4882a593Smuzhiyun #define MIO_EMM_CFG(x)		(0x00 + x->reg_off)
38*4882a593Smuzhiyun #define MIO_EMM_SWITCH(x)	(0x48 + x->reg_off)
39*4882a593Smuzhiyun #define MIO_EMM_DMA(x)		(0x50 + x->reg_off)
40*4882a593Smuzhiyun #define MIO_EMM_CMD(x)		(0x58 + x->reg_off)
41*4882a593Smuzhiyun #define MIO_EMM_RSP_STS(x)	(0x60 + x->reg_off)
42*4882a593Smuzhiyun #define MIO_EMM_RSP_LO(x)	(0x68 + x->reg_off)
43*4882a593Smuzhiyun #define MIO_EMM_RSP_HI(x)	(0x70 + x->reg_off)
44*4882a593Smuzhiyun #define MIO_EMM_INT(x)		(0x78 + x->reg_off)
45*4882a593Smuzhiyun #define MIO_EMM_INT_EN(x)	(0x80 + x->reg_off)
46*4882a593Smuzhiyun #define MIO_EMM_WDOG(x)		(0x88 + x->reg_off)
47*4882a593Smuzhiyun #define MIO_EMM_SAMPLE(x)	(0x90 + x->reg_off)
48*4882a593Smuzhiyun #define MIO_EMM_STS_MASK(x)	(0x98 + x->reg_off)
49*4882a593Smuzhiyun #define MIO_EMM_RCA(x)		(0xa0 + x->reg_off)
50*4882a593Smuzhiyun #define MIO_EMM_INT_EN_SET(x)	(0xb0 + x->reg_off)
51*4882a593Smuzhiyun #define MIO_EMM_INT_EN_CLR(x)	(0xb8 + x->reg_off)
52*4882a593Smuzhiyun #define MIO_EMM_BUF_IDX(x)	(0xe0 + x->reg_off)
53*4882a593Smuzhiyun #define MIO_EMM_BUF_DAT(x)	(0xe8 + x->reg_off)
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun struct cvm_mmc_host {
56*4882a593Smuzhiyun 	struct device *dev;
57*4882a593Smuzhiyun 	void __iomem *base;
58*4882a593Smuzhiyun 	void __iomem *dma_base;
59*4882a593Smuzhiyun 	int reg_off;
60*4882a593Smuzhiyun 	int reg_off_dma;
61*4882a593Smuzhiyun 	u64 emm_cfg;
62*4882a593Smuzhiyun 	u64 n_minus_one;	/* OCTEON II workaround location */
63*4882a593Smuzhiyun 	int last_slot;
64*4882a593Smuzhiyun 	struct clk *clk;
65*4882a593Smuzhiyun 	int sys_freq;
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	struct mmc_request *current_req;
68*4882a593Smuzhiyun 	struct sg_mapping_iter smi;
69*4882a593Smuzhiyun 	bool dma_active;
70*4882a593Smuzhiyun 	bool use_sg;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	bool has_ciu3;
73*4882a593Smuzhiyun 	bool big_dma_addr;
74*4882a593Smuzhiyun 	bool need_irq_handler_lock;
75*4882a593Smuzhiyun 	spinlock_t irq_handler_lock;
76*4882a593Smuzhiyun 	struct semaphore mmc_serializer;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	struct gpio_desc *global_pwr_gpiod;
79*4882a593Smuzhiyun 	atomic_t shared_power_users;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	struct cvm_mmc_slot *slot[CAVIUM_MAX_MMC];
82*4882a593Smuzhiyun 	struct platform_device *slot_pdev[CAVIUM_MAX_MMC];
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	void (*set_shared_power)(struct cvm_mmc_host *, int);
85*4882a593Smuzhiyun 	void (*acquire_bus)(struct cvm_mmc_host *);
86*4882a593Smuzhiyun 	void (*release_bus)(struct cvm_mmc_host *);
87*4882a593Smuzhiyun 	void (*int_enable)(struct cvm_mmc_host *, u64);
88*4882a593Smuzhiyun 	/* required on some MIPS models */
89*4882a593Smuzhiyun 	void (*dmar_fixup)(struct cvm_mmc_host *, struct mmc_command *,
90*4882a593Smuzhiyun 			   struct mmc_data *, u64);
91*4882a593Smuzhiyun 	void (*dmar_fixup_done)(struct cvm_mmc_host *);
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun struct cvm_mmc_slot {
95*4882a593Smuzhiyun 	struct mmc_host *mmc;		/* slot-level mmc_core object */
96*4882a593Smuzhiyun 	struct cvm_mmc_host *host;	/* common hw for all slots */
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	u64 clock;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	u64 cached_switch;
101*4882a593Smuzhiyun 	u64 cached_rca;
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	unsigned int cmd_cnt;		/* sample delay */
104*4882a593Smuzhiyun 	unsigned int dat_cnt;		/* sample delay */
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	int bus_id;
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun struct cvm_mmc_cr_type {
110*4882a593Smuzhiyun 	u8 ctype;
111*4882a593Smuzhiyun 	u8 rtype;
112*4882a593Smuzhiyun };
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun struct cvm_mmc_cr_mods {
115*4882a593Smuzhiyun 	u8 ctype_xor;
116*4882a593Smuzhiyun 	u8 rtype_xor;
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun /* Bitfield definitions */
120*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CFG_CLR	BIT_ULL(16)
121*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CFG_INT_LVL	GENMASK_ULL(12, 8)
122*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CFG_COUNT	GENMASK_ULL(4, 0)
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_RW		BIT_ULL(62)
125*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_INTDIS	BIT_ULL(60)
126*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_SWAP32	BIT_ULL(59)
127*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_SWAP16	BIT_ULL(58)
128*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_SWAP8	BIT_ULL(57)
129*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_ENDIAN	BIT_ULL(56)
130*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_SIZE	GENMASK_ULL(55, 36)
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #define MIO_EMM_CMD_SKIP_BUSY		BIT_ULL(62)
133*4882a593Smuzhiyun #define MIO_EMM_CMD_BUS_ID		GENMASK_ULL(61, 60)
134*4882a593Smuzhiyun #define MIO_EMM_CMD_VAL			BIT_ULL(59)
135*4882a593Smuzhiyun #define MIO_EMM_CMD_DBUF		BIT_ULL(55)
136*4882a593Smuzhiyun #define MIO_EMM_CMD_OFFSET		GENMASK_ULL(54, 49)
137*4882a593Smuzhiyun #define MIO_EMM_CMD_CTYPE_XOR		GENMASK_ULL(42, 41)
138*4882a593Smuzhiyun #define MIO_EMM_CMD_RTYPE_XOR		GENMASK_ULL(40, 38)
139*4882a593Smuzhiyun #define MIO_EMM_CMD_IDX			GENMASK_ULL(37, 32)
140*4882a593Smuzhiyun #define MIO_EMM_CMD_ARG			GENMASK_ULL(31, 0)
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #define MIO_EMM_DMA_SKIP_BUSY		BIT_ULL(62)
143*4882a593Smuzhiyun #define MIO_EMM_DMA_BUS_ID		GENMASK_ULL(61, 60)
144*4882a593Smuzhiyun #define MIO_EMM_DMA_VAL			BIT_ULL(59)
145*4882a593Smuzhiyun #define MIO_EMM_DMA_SECTOR		BIT_ULL(58)
146*4882a593Smuzhiyun #define MIO_EMM_DMA_DAT_NULL		BIT_ULL(57)
147*4882a593Smuzhiyun #define MIO_EMM_DMA_THRES		GENMASK_ULL(56, 51)
148*4882a593Smuzhiyun #define MIO_EMM_DMA_REL_WR		BIT_ULL(50)
149*4882a593Smuzhiyun #define MIO_EMM_DMA_RW			BIT_ULL(49)
150*4882a593Smuzhiyun #define MIO_EMM_DMA_MULTI		BIT_ULL(48)
151*4882a593Smuzhiyun #define MIO_EMM_DMA_BLOCK_CNT		GENMASK_ULL(47, 32)
152*4882a593Smuzhiyun #define MIO_EMM_DMA_CARD_ADDR		GENMASK_ULL(31, 0)
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_EN		BIT_ULL(63)
155*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_RW		BIT_ULL(62)
156*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_CLR		BIT_ULL(61)
157*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_SWAP32		BIT_ULL(59)
158*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_SWAP16		BIT_ULL(58)
159*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_SWAP8		BIT_ULL(57)
160*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_ENDIAN		BIT_ULL(56)
161*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_SIZE		GENMASK_ULL(55, 36)
162*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_ADR		GENMASK_ULL(35, 0)
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun #define MIO_EMM_INT_SWITCH_ERR		BIT_ULL(6)
165*4882a593Smuzhiyun #define MIO_EMM_INT_SWITCH_DONE		BIT_ULL(5)
166*4882a593Smuzhiyun #define MIO_EMM_INT_DMA_ERR		BIT_ULL(4)
167*4882a593Smuzhiyun #define MIO_EMM_INT_CMD_ERR		BIT_ULL(3)
168*4882a593Smuzhiyun #define MIO_EMM_INT_DMA_DONE		BIT_ULL(2)
169*4882a593Smuzhiyun #define MIO_EMM_INT_CMD_DONE		BIT_ULL(1)
170*4882a593Smuzhiyun #define MIO_EMM_INT_BUF_DONE		BIT_ULL(0)
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_BUS_ID		GENMASK_ULL(61, 60)
173*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_CMD_VAL		BIT_ULL(59)
174*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_SWITCH_VAL	BIT_ULL(58)
175*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_DMA_VAL		BIT_ULL(57)
176*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_DMA_PEND	BIT_ULL(56)
177*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_DBUF_ERR	BIT_ULL(28)
178*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_DBUF		BIT_ULL(23)
179*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_BLK_TIMEOUT	BIT_ULL(22)
180*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_BLK_CRC_ERR	BIT_ULL(21)
181*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_BUSYBIT	BIT_ULL(20)
182*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_STP_TIMEOUT	BIT_ULL(19)
183*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_STP_CRC_ERR	BIT_ULL(18)
184*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_STP_BAD_STS	BIT_ULL(17)
185*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_STP_VAL		BIT_ULL(16)
186*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_TIMEOUT	BIT_ULL(15)
187*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_CRC_ERR	BIT_ULL(14)
188*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_BAD_STS	BIT_ULL(13)
189*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_VAL		BIT_ULL(12)
190*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_TYPE	GENMASK_ULL(11, 9)
191*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_CMD_TYPE	GENMASK_ULL(8, 7)
192*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_CMD_IDX		GENMASK_ULL(6, 1)
193*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_CMD_DONE	BIT_ULL(0)
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun #define MIO_EMM_SAMPLE_CMD_CNT		GENMASK_ULL(25, 16)
196*4882a593Smuzhiyun #define MIO_EMM_SAMPLE_DAT_CNT		GENMASK_ULL(9, 0)
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun #define MIO_EMM_SWITCH_BUS_ID		GENMASK_ULL(61, 60)
199*4882a593Smuzhiyun #define MIO_EMM_SWITCH_EXE		BIT_ULL(59)
200*4882a593Smuzhiyun #define MIO_EMM_SWITCH_ERR0		BIT_ULL(58)
201*4882a593Smuzhiyun #define MIO_EMM_SWITCH_ERR1		BIT_ULL(57)
202*4882a593Smuzhiyun #define MIO_EMM_SWITCH_ERR2		BIT_ULL(56)
203*4882a593Smuzhiyun #define MIO_EMM_SWITCH_HS_TIMING	BIT_ULL(48)
204*4882a593Smuzhiyun #define MIO_EMM_SWITCH_BUS_WIDTH	GENMASK_ULL(42, 40)
205*4882a593Smuzhiyun #define MIO_EMM_SWITCH_POWER_CLASS	GENMASK_ULL(35, 32)
206*4882a593Smuzhiyun #define MIO_EMM_SWITCH_CLK_HI		GENMASK_ULL(31, 16)
207*4882a593Smuzhiyun #define MIO_EMM_SWITCH_CLK_LO		GENMASK_ULL(15, 0)
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun /* Protoypes */
210*4882a593Smuzhiyun irqreturn_t cvm_mmc_interrupt(int irq, void *dev_id);
211*4882a593Smuzhiyun int cvm_mmc_of_slot_probe(struct device *dev, struct cvm_mmc_host *host);
212*4882a593Smuzhiyun int cvm_mmc_of_slot_remove(struct cvm_mmc_slot *slot);
213*4882a593Smuzhiyun extern const char *cvm_mmc_irq_names[];
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun #endif
216