blob: 77096bcb4e656d7e55eaec518eb804c7ccba960e [file] [log] [blame]
Channagoud Kadabi31d648c2015-01-29 12:59:00 -08001/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
Channagoud Kadabi74ed8352013-03-11 13:12:05 -07002 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef __PLATFORM_SDHCI_H_
30#define __PLATFORM_SDHCI_H_
31
32#include <reg.h>
33#include <bits.h>
Channagoud Kadabi89902512013-05-14 13:22:06 -070034#include <kernel/event.h>
Channagoud Kadabi74ed8352013-03-11 13:12:05 -070035
Channagoud Kadabie632e252014-03-31 15:26:00 -070036//#define DEBUG_SDHCI
37
38#ifdef DEBUG_SDHCI
39#define DBG(...) dprintf(ALWAYS, __VA_ARGS__)
40#else
41#define DBG(...)
42#endif
43
Channagoud Kadabi74ed8352013-03-11 13:12:05 -070044/*
45 * Capabilities for the host controller
46 * These values are read from the capabilities
47 * register in the controller
48 */
49struct host_caps {
50 uint32_t base_clk_rate; /* Max clock rate supported */
51 uint32_t max_blk_len; /* Max block len supported */
52 uint8_t bus_width_8bit; /* 8 Bit mode supported */
53 uint8_t adma_support; /* Adma support */
54 uint8_t voltage; /* Supported voltage */
55 uint8_t sdr_support; /* Single Data rate */
56 uint8_t ddr_support; /* Dual Data rate */
57 uint8_t sdr50_support; /* UHS mode, with 100 MHZ clock */
Channagoud Kadabi9b8f8fc2013-07-26 12:02:49 -070058 uint8_t sdr104_support; /* UHS mode, with 200 MHZ clock */
Channagoud Kadabi3091dbd2014-11-12 13:00:33 -080059 uint8_t hs200_support; /* Hs200 mode, with 200 MHZ clock */
Channagoud Kadabie9168e82014-01-28 21:33:34 -080060 uint8_t hs400_support; /* Hs400 mode, with 400 MHZ clock */
Channagoud Kadabi74ed8352013-03-11 13:12:05 -070061};
62
63/*
64 * sdhci host structure, holding information about host
65 * controller parameters
66 */
67struct sdhci_host {
Channagoud Kadabi9b8f8fc2013-07-26 12:02:49 -070068 uint32_t base; /* Base address for the host */
69 uint32_t cur_clk_rate; /* Running clock rate */
70 uint32_t timing; /* current timing for the host */
71 bool tuning_in_progress; /* Tuning is being executed */
Channagoud Kadabi756e1e32014-06-05 13:00:55 -070072 uint8_t major; /* host controller minor ver */
73 uint16_t minor; /* host controller major ver */
74 bool use_cdclp533; /* Use cdclp533 calibration circuit */
Channagoud Kadabi9b8f8fc2013-07-26 12:02:49 -070075 event_t* sdhc_event; /* Event for power control irqs */
76 struct host_caps caps; /* Host capabilities */
77 struct sdhci_msm_data *msm_host; /* MSM specific host info */
Channagoud Kadabi74ed8352013-03-11 13:12:05 -070078};
79
80/*
81 * Data pointer to be read/written
82 */
83struct mmc_data {
84 void *data_ptr; /* Points to stream of data */
Channagoud Kadabi709ce1c2013-05-29 15:19:15 -070085 uint32_t blk_sz; /* Block size for the data */
Channagoud Kadabi74ed8352013-03-11 13:12:05 -070086 uint32_t num_blocks; /* num of blocks, each always of size SDHCI_MMC_BLK_SZ */
87};
88
89/*
90 * mmc command structure as per the spec
91 */
92struct mmc_command {
93 uint16_t cmd_index; /* Command index */
94 uint32_t argument; /* Command argument */
95 uint8_t data_present; /* Command has data */
96 uint8_t cmd_type; /* command type */
97 uint16_t resp_type; /* Response type of the command */
98 uint32_t resp[4]; /* 128 bit response value */
99 uint32_t trans_mode; /* Transfer mode, read/write */
100 uint32_t cmd_retry; /* Retry the command, if card is busy */
Channagoud Kadabi89902512013-05-14 13:22:06 -0700101 uint32_t cmd23_support; /* If card supports cmd23 */
Channagoud Kadabi7491e6c2014-12-02 15:42:11 -0800102 uint64_t cmd_timeout; /* Command timeout in us */
Channagoud Kadabi31d648c2015-01-29 12:59:00 -0800103 bool write_flag; /* Write flag, for reliable write cases */
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700104 struct mmc_data data; /* Data pointer */
Sridhar Parasuramc97e0542015-06-26 16:14:58 -0700105 uint8_t rel_write; /* Reliable write enable flag */
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700106};
107
108/*
109 * Descriptor table for adma
110 */
111struct desc_entry {
112 uint16_t tran_att; /* Attribute for transfer data */
113 uint16_t len; /* Length of data */
Channagoud Kadabi2e233e72013-06-06 14:09:57 -0700114 uint32_t addr; /* Address of the data */
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700115};
116
117/*
118 * Command types for sdhci
119 */
120enum {
121 SDHCI_CMD_TYPE_NORMAL = 0,
122 SDHCI_CMD_TYPE_SUSPEND,
123 SDHCI_CMD_TYPE_RESUME,
124 SDHCI_CMD_TYPE_ABORT,
125} sdhci_cmd_type;
126
127/*
128 * Response type values for sdhci
129 */
130enum {
131 SDHCI_CMD_RESP_NONE = 0,
132 SDHCI_CMD_RESP_136,
133 SDHCI_CMD_RESP_48,
134 SDHCI_CMD_RESP_48_BUSY,
135} sdhci_resp_type;
136
137
138/*
139 * Helper macros for writing byte, word & long registers
140 */
Channagoud Kadabie632e252014-03-31 15:26:00 -0700141#define REG_READ8(host, a) readb(host->base + a)
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700142#define REG_WRITE8(host, v, a) writeb(v, (host->base + a))
143
144#define REG_READ32(host, a) readl(host->base + a)
145#define REG_WRITE32(host, v, a) writel(v, (host->base + a))
Channagoud Kadabi9b8f8fc2013-07-26 12:02:49 -0700146#define REG_RMW32(host, a, s, w, v) RMWREG32((host->base + a), s, w, v)
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700147
148#define REG_READ16(host, a) readhw(host->base + a)
149#define REG_WRITE16(host, v, a) writehw(v, (host->base + a))
150
151/*
152 * SDHCI registers, as per the host controller spec v 3.0
153 */
154#define SDHCI_ARG2_REG (0x000)
155#define SDHCI_BLKSZ_REG (0x004)
156#define SDHCI_BLK_CNT_REG (0x006)
157#define SDHCI_ARGUMENT_REG (0x008)
158#define SDHCI_TRANS_MODE_REG (0x00C)
159#define SDHCI_CMD_REG (0x00E)
160#define SDHCI_RESP_REG (0x010)
161#define SDHCI_PRESENT_STATE_REG (0x024)
162#define SDHCI_HOST_CTRL1_REG (0x028)
163#define SDHCI_PWR_CTRL_REG (0x029)
164#define SDHCI_CLK_CTRL_REG (0x02C)
165#define SDHCI_TIMEOUT_REG (0x02E)
166#define SDHCI_RESET_REG (0x02F)
167#define SDHCI_NRML_INT_STS_REG (0x030)
168#define SDHCI_ERR_INT_STS_REG (0x032)
169#define SDHCI_NRML_INT_STS_EN_REG (0x034)
170#define SDHCI_ERR_INT_STS_EN_REG (0x036)
171#define SDHCI_NRML_INT_SIG_EN_REG (0x038)
172#define SDHCI_ERR_INT_SIG_EN_REG (0x03A)
Channagoud Kadabie632e252014-03-31 15:26:00 -0700173#define SDHCI_AUTO_CMD_ERR (0x03C)
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700174#define SDHCI_HOST_CTRL2_REG (0x03E)
175#define SDHCI_CAPS_REG1 (0x040)
176#define SDHCI_CAPS_REG2 (0x044)
Channagoud Kadabie632e252014-03-31 15:26:00 -0700177#define SDHCI_ADM_ERR_REG (0x054)
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700178#define SDHCI_ADM_ADDR_REG (0x058)
179
180/*
181 * Helper macros for register writes
182 */
183#define SDHCI_SOFT_RESET BIT(0)
184#define SOFT_RESET_CMD BIT(1)
185#define SOFT_RESET_DATA BIT(2)
Channagoud Kadabi7ad70ea2013-08-08 13:51:04 -0700186#define SDHCI_RESET_MAX_TIMEOUT 0x64
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700187#define SDHCI_1_8_VOL_SET BIT(3)
188
189/*
190 * Interrupt related
191 */
192#define SDHCI_NRML_INT_STS_EN 0x000B
193#define SDHCI_ERR_INT_STS_EN 0xFFFF
194#define SDHCI_NRML_INT_SIG_EN 0x000B
195#define SDHCI_ERR_INT_SIG_EN 0xFFFF
196
197#define SDCC_HC_INT_CARD_REMOVE BIT(7)
198#define SDCC_HC_INT_CARD_INSERT BIT(6)
199
200/*
201 * HC mode enable/disable
202 */
203#define SDHCI_HC_MODE_EN BIT(0)
204#define SDHCI_HC_MODE_DIS (0 << 1)
205
206/*
207 * Clk control related
208 */
209#define SDHCI_CLK_MAX_DIV 2046
210#define SDHCI_SDCLK_FREQ_SEL 8
211#define SDHCI_SDCLK_UP_BIT_SEL 6
212#define SDHCI_SDCLK_FREQ_MASK 0xFF
213#define SDHC_SDCLK_UP_BIT_MASK 0x300
214#define SDHCI_INT_CLK_EN BIT(0)
215#define SDHCI_CLK_STABLE_MASK BIT(1)
216#define SDHCI_CLK_STABLE BIT(1)
217#define SDHCI_CLK_EN BIT(2)
218#define SDHCI_CLK_DIS (0 << 2)
219#define SDHCI_CLK_RATE_MASK 0x0000FF00
220#define SDHCI_CLK_RATE_BIT 8
221
222#define SDHCI_CMD_ACT BIT(0)
223#define SDHCI_DAT_ACT BIT(1)
224
225/*
226 * Bus voltage related macros
227 */
228#define SDHCI_BUS_VOL_SEL 1
229#define SDHCI_BUS_PWR_EN BIT(0)
230#define SDHCI_VOL_1_8 5
231#define SDHCI_VOL_3_0 6
232#define SDHCI_VOL_3_3 7
233#define SDHCI_3_3_VOL_MASK 0x01000000
234#define SDHCI_3_0_VOL_MASK 0x02000000
235#define SDHCI_1_8_VOL_MASK 0x04000000
236
237/*
238 * Bus width related macros
239 */
240#define SDHCI_8BIT_WIDTH_MASK 0x00040000
241
242#define SDHCI_BUS_WITDH_1BIT (0)
243#define SDHCI_BUS_WITDH_4BIT BIT(1)
244#define SDHCI_BUS_WITDH_8BIT BIT(5)
245
246/*
247 * Adma related macros
248 */
249#define SDHCI_BLK_LEN_MASK 0x00030000
250#define SDHCI_BLK_LEN_BIT 16
251#define SDHCI_BLK_ADMA_MASK 0x00080000
252#define SDHCI_INT_STS_TRANS_COMPLETE BIT(1)
253#define SDHCI_STATE_CMD_DAT_MASK 0x0003
254#define SDHCI_INT_STS_CMD_COMPLETE BIT(0)
255#define SDHCI_ERR_INT_STAT_MASK 0x8000
256#define SDHCI_ADMA_DESC_LINE_SZ 65536
257#define SDHCI_ADMA_MAX_TRANS_SZ (65535 * 512)
258#define SDHCI_ADMA_TRANS_VALID BIT(0)
259#define SDHCI_ADMA_TRANS_END BIT(1)
260#define SDHCI_ADMA_TRANS_DATA BIT(5)
261#define SDHCI_MMC_BLK_SZ 512
262#define SDHCI_MMC_CUR_BLK_CNT_BIT 16
263#define SDHCI_MMC_BLK_SZ_BIT 0
264#define SDHCI_TRANS_MULTI BIT(5)
265#define SDHCI_TRANS_SINGLE (0 << 5)
266#define SDHCI_BLK_CNT_EN BIT(1)
267#define SDHCI_DMA_EN BIT(0)
268#define SDHCI_AUTO_CMD23_EN BIT(3)
Channagoud Kadabi89902512013-05-14 13:22:06 -0700269#define SDHCI_AUTO_CMD12_EN BIT(2)
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700270#define SDHCI_ADMA_32BIT BIT(4)
271
272/*
273 * Command related macros
274 */
275#define SDHCI_CMD_RESP_TYPE_SEL_BIT 0
276#define SDHCI_CMD_CRC_CHECK_BIT 3
277#define SDHCI_CMD_IDX_CHECK_BIT 4
278#define SDHCI_CMD_DATA_PRESENT_BIT 5
279#define SDHCI_CMD_CMD_TYPE_BIT 6
280#define SDHCI_CMD_CMD_IDX_BIT 8
281#define SDHCI_CMD_TIMEOUT_MASK BIT(0)
282#define SDHCI_CMD_CRC_MASK BIT(1)
283#define SDHCI_CMD_END_BIT_MASK BIT(2)
284#define SDHCI_CMD_IDX_MASK BIT(3)
285#define SDHCI_DAT_TIMEOUT_MASK BIT(4)
286#define SDHCI_DAT_CRC_MASK BIT(5)
287#define SDHCI_DAT_END_BIT_MASK BIT(6)
288#define SDHCI_CUR_LIM_MASK BIT(7)
289#define SDHCI_AUTO_CMD12_MASK BIT(8)
290#define SDHCI_ADMA_MASK BIT(9)
291#define SDHCI_READ_MODE BIT(4)
292#define SDHCI_SWITCH_CMD 6
Channagoud Kadabi131b7172013-06-18 16:23:49 -0700293#define SDHCI_CMD_TIMEOUT 0xF
Sridhar Parasurame2f25ce2015-07-31 13:53:07 -0700294#define SDHCI_MAX_CMD_RETRY 9000000
Channagoud Kadabi96622212014-07-30 12:13:28 -0700295#define SDHCI_MAX_TRANS_RETRY 10000000
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700296
297#define SDHCI_PREP_CMD(c, f) ((((c) & 0xff) << 8) | ((f) & 0xff))
298
299/*
300 * command response related
301 */
302#define SDHCI_RESP_LSHIFT 8
303#define SDHCI_RESP_RSHIFT 24
304
305/*
306 * Power control relatd macros
307 */
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700308#define SDCC_HC_PWR_CTRL_INT 0xF
309#define SDCC_HC_BUS_ON BIT(0)
310#define SDCC_HC_BUS_OFF BIT(1)
311#define SDCC_HC_BUS_ON_OFF_SUCC BIT(0)
312#define SDCC_HC_IO_SIG_LOW BIT(2)
313#define SDCC_HC_IO_SIG_HIGH BIT(3)
314#define SDCC_HC_IO_SIG_SUCC BIT(2)
315
316/*
317 * Command response
318 */
319#define SDHCI_CMD_RESP_NONE 0
320#define SDHCI_CMD_RESP_R1 BIT(0)
321#define SDHCI_CMD_RESP_R1B BIT(1)
322#define SDHCI_CMD_RESP_R2 BIT(2)
323#define SDHCI_CMD_RESP_R3 BIT(3)
324#define SDHCI_CMD_RESP_R6 BIT(6)
325#define SDHCI_CMD_RESP_R7 BIT(7)
326
327/*
328 * Clock Divider values
329 */
330#define SDHCI_CLK_400KHZ 400000
331#define SDHCI_CLK_25MHZ 25000000
332#define SDHCI_CLK_50MHZ 50000000
333#define SDHCI_CLK_100MHZ 100000000
334#define SDHCI_CLK_200MHZ 200000000
Channagoud Kadabi9b8f8fc2013-07-26 12:02:49 -0700335#define SDHCI_CLK_400MHZ 400000000
336
337/* UHS macros */
338#define SDHCI_UHS_MODE_MASK 0x0007
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700339
340/* DDR mode related macros */
Channagoud Kadabi9b8f8fc2013-07-26 12:02:49 -0700341#define SDHCI_DDR50_MODE_EN 0x0004
342#define SDHCI_DDR50_MODE_MASK BIT(2)
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700343
344/* HS200/SDR50 mode related macros */
Channagoud Kadabi9b8f8fc2013-07-26 12:02:49 -0700345#define SDHCI_SDR25_MODE_EN 0x0001
346#define SDHCI_SDR12_MODE_EN 0x0000
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700347#define SDHCI_SDR50_MODE_MASK BIT(0)
348#define SDHCI_SDR50_MODE_EN 0x0002
349
Channagoud Kadabi9b8f8fc2013-07-26 12:02:49 -0700350#define SDHCI_SDR104_MODE_MASK BIT(1)
351#define SDHCI_SDR104_MODE_EN 0x0003
352
353#define SDHCI_SDR104_MODE 0x3
354#define SDHCI_SDR50_MODE 0x2
355#define SDHCI_DDR50_MODE 0x4
356#define SDHCI_SDR25_MODE 0x1
357#define SDHCI_SDR12_MODE 0x0
358
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700359/*
360 * APIs and macros exposed for mmc/sd drivers
361 */
362#define SDHCI_MMC_WRITE 0
363#define SDHCI_MMC_READ 1
364
365#define DATA_BUS_WIDTH_1BIT 0
366#define DATA_BUS_WIDTH_4BIT 1
367#define DATA_BUS_WIDTH_8BIT 2
368#define DATA_DDR_BUS_WIDTH_4BIT 5
369#define DATA_DDR_BUS_WIDTH_8BIT 6
370
371/* API: to initialize the controller */
372void sdhci_init(struct sdhci_host *);
373/* API: Send the command & transfer data using adma */
374uint32_t sdhci_send_command(struct sdhci_host *, struct mmc_command *);
375/* API: Set the bus width for the contoller */
376uint8_t sdhci_set_bus_width(struct sdhci_host *, uint16_t);
377/* API: Clock supply for the controller */
378uint32_t sdhci_clk_supply(struct sdhci_host *, uint32_t);
Channagoud Kadabi9b8f8fc2013-07-26 12:02:49 -0700379/* API: To enable SDR/DDR mode */
380void sdhci_set_uhs_mode(struct sdhci_host *, uint32_t);
381/* API: Soft reset for the controller */
382void sdhci_reset(struct sdhci_host *host, uint8_t mask);
Channagoud Kadabi74ed8352013-03-11 13:12:05 -0700383#endif