summaryrefslogtreecommitdiff
path: root/drivers/mmc/host/sdhci-uhs2.h
blob: da69059196301b89cb94bc4dee6288caff0d1703 (plain)
1
2
3
4
5
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
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
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Header file for Host Controller UHS2 related registers.
 *
 *  Copyright (C) 2014 Intel Corp, All Rights Reserved.
 */
#ifndef __SDHCI_UHS2_H
#define __SDHCI_UHS2_H

#include <linux/bits.h>

/* SDHCI Category C registers : UHS2 usage */

#define  SDHCI_UHS2_CM_TRAN_RESP		0x10
#define  SDHCI_UHS2_SD_TRAN_RESP		0x18
#define  SDHCI_UHS2_SD_TRAN_RESP_1		0x1C

/* SDHCI Category B registers : UHS2 only */

#define SDHCI_UHS2_BLOCK_SIZE			0x80
#define  SDHCI_UHS2_MAKE_BLKSZ(dma, blksz)	((((dma) & 0x7) << 12) | ((blksz) & 0xFFF))

#define SDHCI_UHS2_BLOCK_COUNT			0x84

#define SDHCI_UHS2_CMD_PACKET			0x88
#define  SDHCI_UHS2_CMD_PACK_MAX_LEN		20

#define SDHCI_UHS2_TRANS_MODE			0x9C
#define  SDHCI_UHS2_TRNS_DMA			BIT(0)
#define  SDHCI_UHS2_TRNS_BLK_CNT_EN		BIT(1)
#define  SDHCI_UHS2_TRNS_DATA_TRNS_WRT		BIT(4)
#define  SDHCI_UHS2_TRNS_BLK_BYTE_MODE		BIT(5)
#define  SDHCI_UHS2_TRNS_RES_R5			BIT(6)
#define  SDHCI_UHS2_TRNS_RES_ERR_CHECK_EN	BIT(7)
#define  SDHCI_UHS2_TRNS_RES_INT_DIS		BIT(8)
#define  SDHCI_UHS2_TRNS_WAIT_EBSY		BIT(14)
#define  SDHCI_UHS2_TRNS_2L_HD			BIT(15)

#define SDHCI_UHS2_CMD				0x9E
#define  SDHCI_UHS2_CMD_SUB_CMD			BIT(2)
#define  SDHCI_UHS2_CMD_DATA			BIT(5)
#define  SDHCI_UHS2_CMD_TRNS_ABORT		BIT(6)
#define  SDHCI_UHS2_CMD_CMD12			BIT(7)
#define  SDHCI_UHS2_CMD_DORMANT			GENMASK(7, 6)
#define  SDHCI_UHS2_CMD_PACK_LEN_MASK		GENMASK(12, 8)

#define SDHCI_UHS2_RESPONSE			0xA0
#define  SDHCI_UHS2_RESPONSE_MAX_LEN		20

#define SDHCI_UHS2_MSG_SELECT			0xB4
#define SDHCI_UHS2_MSG_SELECT_CURR		0x0
#define SDHCI_UHS2_MSG_SELECT_ONE		0x1
#define SDHCI_UHS2_MSG_SELECT_TWO		0x2
#define SDHCI_UHS2_MSG_SELECT_THREE		0x3

#define SDHCI_UHS2_MSG				0xB8

#define SDHCI_UHS2_DEV_INT_STATUS		0xBC

#define SDHCI_UHS2_DEV_SELECT			0xBE
#define SDHCI_UHS2_DEV_SEL_MASK			GENMASK(3, 0)
#define SDHCI_UHS2_DEV_SEL_INT_MSG_EN		BIT(7)

#define SDHCI_UHS2_DEV_INT_CODE			0xBF

#define SDHCI_UHS2_SW_RESET			0xC0
#define SDHCI_UHS2_SW_RESET_FULL		BIT(0)
#define SDHCI_UHS2_SW_RESET_SD			BIT(1)

#define SDHCI_UHS2_TIMER_CTRL			0xC2
#define SDHCI_UHS2_TIMER_CTRL_DEADLOCK_MASK	GENMASK(7, 4)

#define SDHCI_UHS2_INT_STATUS			0xC4
#define SDHCI_UHS2_INT_STATUS_ENABLE		0xC8
#define SDHCI_UHS2_INT_SIGNAL_ENABLE		0xCC
#define SDHCI_UHS2_INT_HEADER_ERR		BIT(0)
#define SDHCI_UHS2_INT_RES_ERR			BIT(1)
#define SDHCI_UHS2_INT_RETRY_EXP		BIT(2)
#define SDHCI_UHS2_INT_CRC			BIT(3)
#define SDHCI_UHS2_INT_FRAME_ERR		BIT(4)
#define SDHCI_UHS2_INT_TID_ERR			BIT(5)
#define SDHCI_UHS2_INT_UNRECOVER		BIT(7)
#define SDHCI_UHS2_INT_EBUSY_ERR		BIT(8)
#define SDHCI_UHS2_INT_ADMA_ERROR		BIT(15)
#define SDHCI_UHS2_INT_CMD_TIMEOUT		BIT(16)
#define SDHCI_UHS2_INT_DEADLOCK_TIMEOUT		BIT(17)
#define SDHCI_UHS2_INT_VENDOR_ERR		BIT(27)
#define SDHCI_UHS2_INT_ERROR_MASK	       ( \
		SDHCI_UHS2_INT_HEADER_ERR      | \
		SDHCI_UHS2_INT_RES_ERR	       | \
		SDHCI_UHS2_INT_RETRY_EXP       | \
		SDHCI_UHS2_INT_CRC	       | \
		SDHCI_UHS2_INT_FRAME_ERR       | \
		SDHCI_UHS2_INT_TID_ERR	       | \
		SDHCI_UHS2_INT_UNRECOVER       | \
		SDHCI_UHS2_INT_EBUSY_ERR       | \
		SDHCI_UHS2_INT_ADMA_ERROR      | \
		SDHCI_UHS2_INT_CMD_TIMEOUT     | \
		SDHCI_UHS2_INT_DEADLOCK_TIMEOUT)
#define SDHCI_UHS2_INT_CMD_ERR_MASK	  ( \
		SDHCI_UHS2_INT_HEADER_ERR | \
		SDHCI_UHS2_INT_RES_ERR	  | \
		SDHCI_UHS2_INT_FRAME_ERR  | \
		SDHCI_UHS2_INT_TID_ERR	  | \
		SDHCI_UHS2_INT_CMD_TIMEOUT)
/* CRC Error occurs during a packet receiving */
#define SDHCI_UHS2_INT_DATA_ERR_MASK	       ( \
		SDHCI_UHS2_INT_RETRY_EXP       | \
		SDHCI_UHS2_INT_CRC	       | \
		SDHCI_UHS2_INT_UNRECOVER       | \
		SDHCI_UHS2_INT_EBUSY_ERR       | \
		SDHCI_UHS2_INT_ADMA_ERROR      | \
		SDHCI_UHS2_INT_DEADLOCK_TIMEOUT)

#define SDHCI_UHS2_SETTINGS_PTR			0xE0
#define   SDHCI_UHS2_GEN_SETTINGS_POWER_LOW	BIT(0)
#define   SDHCI_UHS2_GEN_SETTINGS_N_LANES_MASK	GENMASK(11, 8)
#define   SDHCI_UHS2_FD_OR_2L_HD		0x0 /* 2 lanes */
#define   SDHCI_UHS2_2D1U_FD			0x2 /* 3 lanes, 2 down, 1 up, full duplex */
#define   SDHCI_UHS2_1D2U_FD			0x3 /* 3 lanes, 1 down, 2 up, full duplex */
#define   SDHCI_UHS2_2D2U_FD			0x4 /* 4 lanes, 2 down, 2 up, full duplex */

#define   SDHCI_UHS2_PHY_SET_SPEED_B		BIT(6)
#define   SDHCI_UHS2_PHY_HIBERNATE_EN		BIT(12)
#define   SDHCI_UHS2_PHY_N_LSS_SYN_MASK		GENMASK(19, 16)
#define   SDHCI_UHS2_PHY_N_LSS_DIR_MASK		GENMASK(23, 20)

#define   SDHCI_UHS2_TRAN_N_FCU_MASK		GENMASK(15, 8)
#define   SDHCI_UHS2_TRAN_RETRY_CNT_MASK	GENMASK(17, 16)
#define   SDHCI_UHS2_TRAN_1_N_DAT_GAP_MASK	GENMASK(7, 0)

#define SDHCI_UHS2_CAPS_PTR			0xE2
#define   SDHCI_UHS2_CAPS_OFFSET		0
#define   SDHCI_UHS2_CAPS_DAP_MASK		GENMASK(3, 0)
#define   SDHCI_UHS2_CAPS_GAP_MASK		GENMASK(7, 4)
#define   SDHCI_UHS2_CAPS_GAP(gap)		((gap) * 360)
#define   SDHCI_UHS2_CAPS_LANE_MASK		GENMASK(13, 8)
#define   SDHCI_UHS2_CAPS_2L_HD_FD		1
#define   SDHCI_UHS2_CAPS_2D1U_FD		2
#define   SDHCI_UHS2_CAPS_1D2U_FD		4
#define   SDHCI_UHS2_CAPS_2D2U_FD		8
#define   SDHCI_UHS2_CAPS_ADDR_64		BIT(14)
#define   SDHCI_UHS2_CAPS_BOOT			BIT(15)
#define   SDHCI_UHS2_CAPS_DEV_TYPE_MASK		GENMASK(17, 16)
#define   SDHCI_UHS2_CAPS_DEV_TYPE_RMV		0
#define   SDHCI_UHS2_CAPS_DEV_TYPE_EMB		1
#define   SDHCI_UHS2_CAPS_DEV_TYPE_EMB_RMV	2
#define   SDHCI_UHS2_CAPS_NUM_DEV_MASK		GENMASK(21, 18)
#define   SDHCI_UHS2_CAPS_BUS_TOPO_MASK		GENMASK(23, 22)
#define   SDHCI_UHS2_CAPS_BUS_TOPO_SHIFT	22
#define   SDHCI_UHS2_CAPS_BUS_TOPO_P2P		0
#define   SDHCI_UHS2_CAPS_BUS_TOPO_RING		1
#define   SDHCI_UHS2_CAPS_BUS_TOPO_HUB		2
#define   SDHCI_UHS2_CAPS_BUS_TOPO_HUB_RING	3

#define  SDHCI_UHS2_CAPS_PHY_OFFSET		4
#define   SDHCI_UHS2_CAPS_PHY_REV_MASK		GENMASK(5, 0)
#define   SDHCI_UHS2_CAPS_PHY_RANGE_MASK	GENMASK(7, 6)
#define   SDHCI_UHS2_CAPS_PHY_RANGE_A		0
#define   SDHCI_UHS2_CAPS_PHY_RANGE_B		1
#define   SDHCI_UHS2_CAPS_PHY_N_LSS_SYN_MASK	GENMASK(19, 16)
#define   SDHCI_UHS2_CAPS_PHY_N_LSS_DIR_MASK	GENMASK(23, 20)
#define  SDHCI_UHS2_CAPS_TRAN_OFFSET		8
#define   SDHCI_UHS2_CAPS_TRAN_LINK_REV_MASK	GENMASK(5, 0)
#define   SDHCI_UHS2_CAPS_TRAN_N_FCU_MASK	GENMASK(15, 8)
#define   SDHCI_UHS2_CAPS_TRAN_HOST_TYPE_MASK	GENMASK(18, 16)
#define   SDHCI_UHS2_CAPS_TRAN_BLK_LEN_MASK	GENMASK(31, 20)

#define  SDHCI_UHS2_CAPS_TRAN_1_OFFSET		12
#define  SDHCI_UHS2_CAPS_TRAN_1_N_DATA_GAP_MASK	GENMASK(7, 0)

#define SDHCI_UHS2_EMBED_CTRL_PTR		0xE6
#define SDHCI_UHS2_VENDOR_PTR			0xE8

struct sdhci_host;
struct mmc_command;
struct mmc_request;

void sdhci_uhs2_dump_regs(struct sdhci_host *host);
void sdhci_uhs2_reset(struct sdhci_host *host, u16 mask);
void sdhci_uhs2_set_power(struct sdhci_host *host, unsigned char mode, unsigned short vdd);
void sdhci_uhs2_set_timeout(struct sdhci_host *host, struct mmc_command *cmd);
int sdhci_uhs2_add_host(struct sdhci_host *host);
void sdhci_uhs2_remove_host(struct sdhci_host *host, int dead);
void sdhci_uhs2_clear_set_irqs(struct sdhci_host *host, u32 clear, u32 set);
u32 sdhci_uhs2_irq(struct sdhci_host *host, u32 intmask);

#endif /* __SDHCI_UHS2_H */