1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Driver for Synopsys DesignWare Cores Mobile Storage Host Controller
4 *
5 * Copyright (C) 2018 Synaptics Incorporated
6 *
7 * Author: Jisheng Zhang <jszhang@kernel.org>
8 */
9
10 #include <linux/acpi.h>
11 #include <linux/arm-smccc.h>
12 #include <linux/bitfield.h>
13 #include <linux/clk.h>
14 #include <linux/clk-provider.h>
15 #include <linux/dma-mapping.h>
16 #include <linux/iopoll.h>
17 #include <linux/kernel.h>
18 #include <linux/module.h>
19 #include <linux/of.h>
20 #include <linux/platform_device.h>
21 #include <linux/pm_domain.h>
22 #include <linux/pm_runtime.h>
23 #include <linux/regmap.h>
24 #include <linux/reset.h>
25 #include <linux/sizes.h>
26 #include <linux/mfd/syscon.h>
27 #include <linux/units.h>
28
29 #include "sdhci-pltfm.h"
30 #include "cqhci.h"
31 #include "sdhci-cqhci.h"
32
33 #define SDHCI_DWCMSHC_ARG2_STUFF GENMASK(31, 16)
34
35 /* DWCMSHC specific Mode Select value */
36 #define DWCMSHC_CTRL_HS400 0x7
37
38 /* DWC IP vendor area 1 pointer */
39 #define DWCMSHC_P_VENDOR_AREA1 0xe8
40 #define DWCMSHC_AREA1_MASK GENMASK(11, 0)
41 /* Offset inside the vendor area 1 */
42 #define DWCMSHC_HOST_CTRL3 0x8
43 #define DWCMSHC_HOST_CTRL3_CMD_CONFLICT BIT(0)
44 #define DWCMSHC_EMMC_CONTROL 0x2c
45 /* HPE GSC SoC MSHCCS register */
46 #define HPE_GSC_MSHCCS_SCGSYNCDIS BIT(18)
47 #define DWCMSHC_CARD_IS_EMMC BIT(0)
48 #define DWCMSHC_ENHANCED_STROBE BIT(8)
49 #define DWCMSHC_EMMC_ATCTRL 0x40
50 #define DWCMSHC_AT_STAT 0x44
51 /* Tuning and auto-tuning fields in AT_CTRL_R control register */
52 #define AT_CTRL_AT_EN BIT(0) /* autotuning is enabled */
53 #define AT_CTRL_CI_SEL BIT(1) /* interval to drive center phase select */
54 #define AT_CTRL_SWIN_TH_EN BIT(2) /* sampling window threshold enable */
55 #define AT_CTRL_RPT_TUNE_ERR BIT(3) /* enable reporting framing errors */
56 #define AT_CTRL_SW_TUNE_EN BIT(4) /* enable software managed tuning */
57 #define AT_CTRL_WIN_EDGE_SEL_MASK GENMASK(11, 8) /* bits [11:8] */
58 #define AT_CTRL_WIN_EDGE_SEL 0xf /* sampling window edge select */
59 #define AT_CTRL_TUNE_CLK_STOP_EN BIT(16) /* clocks stopped during phase code change */
60 #define AT_CTRL_PRE_CHANGE_DLY_MASK GENMASK(18, 17) /* bits [18:17] */
61 #define AT_CTRL_PRE_CHANGE_DLY 0x1 /* 2-cycle latency */
62 #define AT_CTRL_POST_CHANGE_DLY_MASK GENMASK(20, 19) /* bits [20:19] */
63 #define AT_CTRL_POST_CHANGE_DLY 0x3 /* 4-cycle latency */
64 #define AT_CTRL_SWIN_TH_VAL_MASK GENMASK(31, 24) /* bits [31:24] */
65 #define AT_CTRL_SWIN_TH_VAL 0x9 /* sampling window threshold */
66
67 /* DWC IP vendor area 2 pointer */
68 #define DWCMSHC_P_VENDOR_AREA2 0xea
69
70 /* Sophgo CV18XX specific Registers */
71 #define CV18XX_SDHCI_MSHC_CTRL 0x00
72 #define CV18XX_EMMC_FUNC_EN BIT(0)
73 #define CV18XX_LATANCY_1T BIT(1)
74 #define CV18XX_SDHCI_PHY_TX_RX_DLY 0x40
75 #define CV18XX_PHY_TX_DLY_MSK GENMASK(6, 0)
76 #define CV18XX_PHY_TX_SRC_MSK GENMASK(9, 8)
77 #define CV18XX_PHY_TX_SRC_INVERT_CLK_TX 0x1
78 #define CV18XX_PHY_RX_DLY_MSK GENMASK(22, 16)
79 #define CV18XX_PHY_RX_SRC_MSK GENMASK(25, 24)
80 #define CV18XX_PHY_RX_SRC_INVERT_RX_CLK 0x1
81 #define CV18XX_SDHCI_PHY_CONFIG 0x4c
82 #define CV18XX_PHY_TX_BPS BIT(0)
83
84 #define CV18XX_TUNE_MAX 128
85 #define CV18XX_TUNE_STEP 1
86 #define CV18XX_RETRY_TUNING_MAX 50
87
88 /* Rockchip specific Registers */
89 #define DWCMSHC_EMMC_DLL_CTRL 0x800
90 #define DWCMSHC_EMMC_DLL_RXCLK 0x804
91 #define DWCMSHC_EMMC_DLL_TXCLK 0x808
92 #define DWCMSHC_EMMC_DLL_STRBIN 0x80c
93 #define DECMSHC_EMMC_DLL_CMDOUT 0x810
94 #define DECMSHC_EMMC_MISC_CON 0x81C
95 #define MISC_INTCLK_EN BIT(1)
96 #define DWCMSHC_EMMC_DLL_STATUS0 0x840
97 #define DWCMSHC_EMMC_DLL_START BIT(0)
98 #define DWCMSHC_EMMC_DLL_LOCKED BIT(8)
99 #define DWCMSHC_EMMC_DLL_TIMEOUT BIT(9)
100 #define DWCMSHC_EMMC_DLL_RXCLK_SRCSEL 29
101 #define DWCMSHC_EMMC_DLL_START_POINT 16
102 #define DWCMSHC_EMMC_DLL_INC 8
103 #define DWCMSHC_EMMC_DLL_BYPASS BIT(24)
104 #define DWCMSHC_EMMC_DLL_DLYENA BIT(27)
105 #define DLL_TXCLK_TAPNUM_DEFAULT 0x10
106 #define DLL_TXCLK_TAPNUM_90_DEGREES 0xA
107 #define DLL_TXCLK_TAPNUM_FROM_SW BIT(24)
108 #define DLL_STRBIN_TAPNUM_DEFAULT 0x4
109 #define DLL_STRBIN_TAPNUM_FROM_SW BIT(24)
110 #define DLL_STRBIN_DELAY_NUM_SEL BIT(26)
111 #define DLL_STRBIN_DELAY_NUM_OFFSET 16
112 #define DLL_STRBIN_DELAY_NUM_DEFAULT 0x16
113 #define DLL_RXCLK_NO_INVERTER 1
114 #define DLL_RXCLK_INVERTER 0
115 #define DLL_CMDOUT_TAPNUM_90_DEGREES 0x8
116 #define DLL_RXCLK_ORI_GATE BIT(31)
117 #define DLL_CMDOUT_TAPNUM_FROM_SW BIT(24)
118 #define DLL_CMDOUT_SRC_CLK_NEG BIT(28)
119 #define DLL_CMDOUT_EN_SRC_CLK_NEG BIT(29)
120
121 #define DLL_LOCK_WO_TMOUT(x) \
122 ((((x) & DWCMSHC_EMMC_DLL_LOCKED) == DWCMSHC_EMMC_DLL_LOCKED) && \
123 (((x) & DWCMSHC_EMMC_DLL_TIMEOUT) == 0))
124
125 /* PHY register area pointer */
126 #define DWC_MSHC_PTR_PHY_R 0x300
127
128 /* PHY general configuration */
129 #define PHY_CNFG_R (DWC_MSHC_PTR_PHY_R + 0x00)
130 #define PHY_CNFG_RSTN_DEASSERT 0x1 /* Deassert PHY reset */
131 #define PHY_CNFG_PHY_PWRGOOD_MASK BIT_MASK(1) /* bit [1] */
132 #define PHY_CNFG_PAD_SP_MASK GENMASK(19, 16) /* bits [19:16] */
133 #define PHY_CNFG_PAD_SP 0x0c /* PMOS TX drive strength */
134 #define PHY_CNFG_PAD_SP_k230 0x09 /* PMOS TX drive strength for k230 */
135 #define PHY_CNFG_PAD_SP_SG2042 0x09 /* PMOS TX drive strength for SG2042 */
136 #define PHY_CNFG_PAD_SN_MASK GENMASK(23, 20) /* bits [23:20] */
137 #define PHY_CNFG_PAD_SN 0x0c /* NMOS TX drive strength */
138 #define PHY_CNFG_PAD_SN_k230 0x08 /* NMOS TX drive strength for k230 */
139 #define PHY_CNFG_PAD_SN_SG2042 0x08 /* NMOS TX drive strength for SG2042 */
140
141 /* PHY command/response pad settings */
142 #define PHY_CMDPAD_CNFG_R (DWC_MSHC_PTR_PHY_R + 0x04)
143
144 /* PHY data pad settings */
145 #define PHY_DATAPAD_CNFG_R (DWC_MSHC_PTR_PHY_R + 0x06)
146
147 /* PHY clock pad settings */
148 #define PHY_CLKPAD_CNFG_R (DWC_MSHC_PTR_PHY_R + 0x08)
149
150 /* PHY strobe pad settings */
151 #define PHY_STBPAD_CNFG_R (DWC_MSHC_PTR_PHY_R + 0x0a)
152
153 /* PHY reset pad settings */
154 #define PHY_RSTNPAD_CNFG_R (DWC_MSHC_PTR_PHY_R + 0x0c)
155
156 /* Bitfields are common for all pad settings */
157 #define PHY_PAD_RXSEL_1V8 0x1 /* Receiver type select for 1.8V */
158 #define PHY_PAD_RXSEL_3V3 0x2 /* Receiver type select for 3.3V */
159
160 #define PHY_PAD_WEAKPULL_MASK GENMASK(4, 3) /* bits [4:3] */
161 #define PHY_PAD_WEAKPULL_DISABLED 0x0 /* Weak pull up and pull down disabled */
162 #define PHY_PAD_WEAKPULL_PULLUP 0x1 /* Weak pull up enabled */
163 #define PHY_PAD_WEAKPULL_PULLDOWN 0x2 /* Weak pull down enabled */
164
165 #define PHY_PAD_TXSLEW_CTRL_P_MASK GENMASK(8, 5) /* bits [8:5] */
166 #define PHY_PAD_TXSLEW_CTRL_P 0x3 /* Slew control for P-Type pad TX */
167 #define PHY_PAD_TXSLEW_CTRL_P_k230 0x2 /* Slew control for P-Type pad TX for k230 */
168 #define PHY_PAD_TXSLEW_CTRL_N_MASK GENMASK(12, 9) /* bits [12:9] */
169 #define PHY_PAD_TXSLEW_CTRL_N 0x3 /* Slew control for N-Type pad TX */
170 #define PHY_PAD_TXSLEW_CTRL_N_SG2042 0x2 /* Slew control for N-Type pad TX for SG2042 */
171 #define PHY_PAD_TXSLEW_CTRL_N_k230 0x2 /* Slew control for N-Type pad TX for k230 */
172
173 /* PHY Common DelayLine config settings */
174 #define PHY_COMMDL_CNFG (DWC_MSHC_PTR_PHY_R + 0x1c)
175 #define PHY_COMMDL_CNFG_DLSTEP_SEL BIT(0) /* DelayLine outputs on PAD enabled */
176
177 /* PHY CLK delay line settings */
178 #define PHY_SDCLKDL_CNFG_R (DWC_MSHC_PTR_PHY_R + 0x1d)
179 #define PHY_SDCLKDL_CNFG_EXTDLY_EN BIT(0)
180 #define PHY_SDCLKDL_CNFG_UPDATE BIT(4) /* set before writing to SDCLKDL_DC */
181
182 /* PHY CLK delay line delay code */
183 #define PHY_SDCLKDL_DC_R (DWC_MSHC_PTR_PHY_R + 0x1e)
184 #define PHY_SDCLKDL_DC_INITIAL 0x40 /* initial delay code */
185 #define PHY_SDCLKDL_DC_DEFAULT 0x32 /* default delay code */
186 #define PHY_SDCLKDL_DC_HS400 0x18 /* delay code for HS400 mode */
187
188 #define PHY_SMPLDL_CNFG_R (DWC_MSHC_PTR_PHY_R + 0x20)
189 #define PHY_SMPLDL_CNFG_EXTDLY_EN BIT(0)
190 #define PHY_SMPLDL_CNFG_BYPASS_EN BIT(1)
191 #define PHY_SMPLDL_CNFG_INPSEL_MASK GENMASK(3, 2) /* bits [3:2] */
192 #define PHY_SMPLDL_CNFG_INPSEL 0x3 /* delay line input source */
193
194 /* PHY drift_cclk_rx delay line configuration setting */
195 #define PHY_ATDL_CNFG_R (DWC_MSHC_PTR_PHY_R + 0x21)
196 #define PHY_ATDL_CNFG_INPSEL_MASK GENMASK(3, 2) /* bits [3:2] */
197 #define PHY_ATDL_CNFG_INPSEL 0x3 /* delay line input source */
198 #define PHY_ATDL_CNFG_INPSEL_SG2042 0x2 /* delay line input source for SG2042 */
199
200 /* PHY DLL control settings */
201 #define PHY_DLL_CTRL_R (DWC_MSHC_PTR_PHY_R + 0x24)
202 #define PHY_DLL_CTRL_DISABLE 0x0 /* PHY DLL is enabled */
203 #define PHY_DLL_CTRL_ENABLE 0x1 /* PHY DLL is disabled */
204
205 /* PHY DLL configuration register 1 */
206 #define PHY_DLL_CNFG1_R (DWC_MSHC_PTR_PHY_R + 0x25)
207 #define PHY_DLL_CNFG1_SLVDLY_MASK GENMASK(5, 4) /* bits [5:4] */
208 #define PHY_DLL_CNFG1_SLVDLY 0x2 /* DLL slave update delay input */
209 #define PHY_DLL_CNFG1_WAITCYCLE 0x5 /* DLL wait cycle input */
210
211 /* PHY DLL configuration register 2 */
212 #define PHY_DLL_CNFG2_R (DWC_MSHC_PTR_PHY_R + 0x26)
213 #define PHY_DLL_CNFG2_JUMPSTEP 0xa /* DLL jump step input */
214
215 /* PHY DLL master and slave delay line configuration settings */
216 #define PHY_DLLDL_CNFG_R (DWC_MSHC_PTR_PHY_R + 0x28)
217 #define PHY_DLLDL_CNFG_SLV_INPSEL_MASK GENMASK(6, 5) /* bits [6:5] */
218 #define PHY_DLLDL_CNFG_SLV_INPSEL 0x3 /* clock source select for slave DL */
219
220 /* PHY DLL offset setting register */
221 #define PHY_DLL_OFFST_R (DWC_MSHC_PTR_PHY_R + 0x29)
222 /* DLL LBT setting register */
223 #define PHY_DLLBT_CNFG_R (DWC_MSHC_PTR_PHY_R + 0x2c)
224 /* DLL Status register */
225 #define PHY_DLL_STATUS_R (DWC_MSHC_PTR_PHY_R + 0x2e)
226 #define DLL_LOCK_STS BIT(0)/* DLL is locked and ready */
227 /*
228 * Captures the value of DLL's lock error status information. Value is valid
229 * only when LOCK_STS is set.
230 */
231 #define DLL_ERROR_STS BIT(1)
232
233 #define FLAG_IO_FIXED_1V8 BIT(0)
234
235 #define BOUNDARY_OK(addr, len) \
236 ((addr | (SZ_128M - 1)) == ((addr + len - 1) | (SZ_128M - 1)))
237
238 #define DWCMSHC_SDHCI_CQE_TRNS_MODE (SDHCI_TRNS_MULTI | \
239 SDHCI_TRNS_BLK_CNT_EN | \
240 SDHCI_TRNS_DMA)
241
242 #define to_pltfm_data(priv, name) \
243 container_of((priv)->dwcmshc_pdata, struct name##_pltfm_data, dwcmshc_pdata)
244
245 /* SMC call for BlueField-3 eMMC RST_N */
246 #define BLUEFIELD_SMC_SET_EMMC_RST_N 0x82000007
247
248 /* Canaan specific Registers */
249 #define SD0_CTRL 0x00
250 #define SD0_HOST_REG_VOL_STABLE BIT(4)
251 #define SD0_CARD_WRITE_PROT BIT(6)
252 #define SD1_CTRL 0x08
253 #define SD1_HOST_REG_VOL_STABLE BIT(0)
254 #define SD1_CARD_WRITE_PROT BIT(2)
255
256 /* Eswin specific Registers */
257 #define EIC7700_CARD_CLK_STABLE BIT(28)
258 #define EIC7700_INT_BCLK_STABLE BIT(16)
259 #define EIC7700_INT_ACLK_STABLE BIT(8)
260 #define EIC7700_INT_TMCLK_STABLE BIT(0)
261 #define EIC7700_INT_CLK_STABLE (EIC7700_CARD_CLK_STABLE | \
262 EIC7700_INT_ACLK_STABLE | \
263 EIC7700_INT_BCLK_STABLE | \
264 EIC7700_INT_TMCLK_STABLE)
265 #define EIC7700_HOST_VAL_STABLE BIT(0)
266
267 /* strength definition */
268 #define PHYCTRL_DR_33OHM 0xee
269 #define PHYCTRL_DR_40OHM 0xcc
270 #define PHYCTRL_DR_50OHM 0x88
271 #define PHYCTRL_DR_66OHM 0x44
272 #define PHYCTRL_DR_100OHM 0x00
273
274 #define MAX_PHASE_CODE 0xff
275 #define TUNING_RANGE_THRESHOLD 40
276 #define PHY_CLK_MAX_DELAY_MASK 0x7f
277 #define PHY_DELAY_CODE_MAX 0x7f
278 #define PHY_DELAY_CODE_EMMC 0x17
279 #define PHY_DELAY_CODE_SD 0x55
280 #define PHY_DELAY_CODE_SDIO 0x29
281
282 struct rk35xx_priv {
283 struct reset_control *reset;
284 u8 txclk_tapnum;
285 };
286
287 struct eic7700_priv {
288 struct reset_control *reset;
289 unsigned int drive_impedance;
290 };
291
292 struct k230_priv {
293 /* Canaan k230 specific */
294 struct regmap *hi_sys_regmap;
295 };
296
297 #define DWCMSHC_MAX_OTHER_CLKS 3
298
299 struct dwcmshc_priv {
300 struct clk *bus_clk;
301 int vendor_specific_area1; /* P_VENDOR_SPECIFIC_AREA1 reg */
302 int vendor_specific_area2; /* P_VENDOR_SPECIFIC_AREA2 reg */
303
304 int num_other_clks;
305 struct clk_bulk_data other_clks[DWCMSHC_MAX_OTHER_CLKS];
306
307 const struct dwcmshc_pltfm_data *dwcmshc_pdata;
308 void *priv; /* pointer to SoC private stuff */
309 u16 delay_line;
310 u16 flags;
311 };
312
313 struct dwcmshc_pltfm_data {
314 const struct sdhci_pltfm_data pdata;
315 const struct cqhci_host_ops *cqhci_host_ops;
316 int (*init)(struct device *dev, struct sdhci_host *host, struct dwcmshc_priv *dwc_priv);
317 void (*postinit)(struct sdhci_host *host, struct dwcmshc_priv *dwc_priv);
318 };
319
320 struct k230_pltfm_data {
321 struct dwcmshc_pltfm_data dwcmshc_pdata;
322 bool is_emmc;
323 u32 ctrl_reg;
324 u32 vol_stable_bit;
325 u32 write_prot_bit;
326 };
327
328 struct rockchip_pltfm_data {
329 struct dwcmshc_pltfm_data dwcmshc_pdata;
330 /*
331 * The controller hardware has two known revisions documented internally:
332 * - Revision 0: Exclusively used by RK3566 and RK3568 SoCs.
333 * - Revision 1: Implemented in all other Rockchip SoCs, including RK3576, RK3588, etc.
334 */
335 int revision;
336 };
337
dwcmshc_enable_card_clk(struct sdhci_host * host)338 static void dwcmshc_enable_card_clk(struct sdhci_host *host)
339 {
340 u16 ctrl;
341
342 ctrl = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
343 if ((ctrl & SDHCI_CLOCK_INT_EN) && !(ctrl & SDHCI_CLOCK_CARD_EN)) {
344 ctrl |= SDHCI_CLOCK_CARD_EN;
345 sdhci_writew(host, ctrl, SDHCI_CLOCK_CONTROL);
346 }
347 }
348
dwcmshc_get_enable_other_clks(struct device * dev,struct dwcmshc_priv * priv,int num_clks,const char * const clk_ids[])349 static int dwcmshc_get_enable_other_clks(struct device *dev,
350 struct dwcmshc_priv *priv,
351 int num_clks,
352 const char * const clk_ids[])
353 {
354 int err;
355
356 if (num_clks > DWCMSHC_MAX_OTHER_CLKS)
357 return -EINVAL;
358
359 for (int i = 0; i < num_clks; i++)
360 priv->other_clks[i].id = clk_ids[i];
361
362 err = devm_clk_bulk_get_optional(dev, num_clks, priv->other_clks);
363 if (err) {
364 dev_err(dev, "failed to get clocks %d\n", err);
365 return err;
366 }
367
368 err = clk_bulk_prepare_enable(num_clks, priv->other_clks);
369 if (err)
370 dev_err(dev, "failed to enable clocks %d\n", err);
371
372 priv->num_other_clks = num_clks;
373
374 return err;
375 }
376
377 /*
378 * If DMA addr spans 128MB boundary, we split the DMA transfer into two
379 * so that each DMA transfer doesn't exceed the boundary.
380 */
dwcmshc_adma_write_desc(struct sdhci_host * host,void ** desc,dma_addr_t addr,int len,unsigned int cmd)381 static void dwcmshc_adma_write_desc(struct sdhci_host *host, void **desc,
382 dma_addr_t addr, int len, unsigned int cmd)
383 {
384 int tmplen, offset;
385
386 if (likely(!len || BOUNDARY_OK(addr, len))) {
387 sdhci_adma_write_desc(host, desc, addr, len, cmd);
388 return;
389 }
390
391 offset = addr & (SZ_128M - 1);
392 tmplen = SZ_128M - offset;
393 sdhci_adma_write_desc(host, desc, addr, tmplen, cmd);
394
395 addr += tmplen;
396 len -= tmplen;
397 sdhci_adma_write_desc(host, desc, addr, len, cmd);
398 }
399
dwcmshc_reset(struct sdhci_host * host,u8 mask)400 static void dwcmshc_reset(struct sdhci_host *host, u8 mask)
401 {
402 sdhci_reset(host, mask);
403
404 /* The dwcmshc does not comply with the SDHCI specification
405 * regarding the "Software Reset for CMD line should clear 'Command
406 * Complete' in the Normal Interrupt Status Register." Clear the bit
407 * here to compensate for this quirk.
408 */
409 if (mask & SDHCI_RESET_CMD)
410 sdhci_writel(host, SDHCI_INT_RESPONSE, SDHCI_INT_STATUS);
411 }
412
dwcmshc_get_max_clock(struct sdhci_host * host)413 static unsigned int dwcmshc_get_max_clock(struct sdhci_host *host)
414 {
415 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
416
417 if (pltfm_host->clk)
418 return sdhci_pltfm_clk_get_max_clock(host);
419 else
420 return pltfm_host->clock;
421 }
422
rk35xx_get_max_clock(struct sdhci_host * host)423 static unsigned int rk35xx_get_max_clock(struct sdhci_host *host)
424 {
425 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
426
427 return clk_round_rate(pltfm_host->clk, ULONG_MAX);
428 }
429
dwcmshc_check_auto_cmd23(struct mmc_host * mmc,struct mmc_request * mrq)430 static void dwcmshc_check_auto_cmd23(struct mmc_host *mmc,
431 struct mmc_request *mrq)
432 {
433 struct sdhci_host *host = mmc_priv(mmc);
434
435 /*
436 * No matter V4 is enabled or not, ARGUMENT2 register is 32-bit
437 * block count register which doesn't support stuff bits of
438 * CMD23 argument on dwcmsch host controller.
439 */
440 if (mrq->sbc && (mrq->sbc->arg & SDHCI_DWCMSHC_ARG2_STUFF))
441 host->flags &= ~SDHCI_AUTO_CMD23;
442 else
443 host->flags |= SDHCI_AUTO_CMD23;
444 }
445
dwcmshc_request(struct mmc_host * mmc,struct mmc_request * mrq)446 static void dwcmshc_request(struct mmc_host *mmc, struct mmc_request *mrq)
447 {
448 dwcmshc_check_auto_cmd23(mmc, mrq);
449
450 sdhci_request(mmc, mrq);
451 }
452
dwcmshc_phy_init(struct sdhci_host * host)453 static void dwcmshc_phy_init(struct sdhci_host *host)
454 {
455 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
456 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
457 u32 rxsel = PHY_PAD_RXSEL_3V3;
458 u32 val;
459
460 if (priv->flags & FLAG_IO_FIXED_1V8 ||
461 host->mmc->ios.timing & MMC_SIGNAL_VOLTAGE_180)
462 rxsel = PHY_PAD_RXSEL_1V8;
463
464 /* deassert phy reset & set tx drive strength */
465 val = PHY_CNFG_RSTN_DEASSERT;
466 val |= FIELD_PREP(PHY_CNFG_PAD_SP_MASK, PHY_CNFG_PAD_SP);
467 val |= FIELD_PREP(PHY_CNFG_PAD_SN_MASK, PHY_CNFG_PAD_SN);
468 sdhci_writel(host, val, PHY_CNFG_R);
469
470 /* disable delay line */
471 sdhci_writeb(host, PHY_SDCLKDL_CNFG_UPDATE, PHY_SDCLKDL_CNFG_R);
472
473 /* set delay line */
474 sdhci_writeb(host, priv->delay_line, PHY_SDCLKDL_DC_R);
475 sdhci_writeb(host, PHY_DLL_CNFG2_JUMPSTEP, PHY_DLL_CNFG2_R);
476
477 /* enable delay lane */
478 val = sdhci_readb(host, PHY_SDCLKDL_CNFG_R);
479 val &= ~(PHY_SDCLKDL_CNFG_UPDATE);
480 sdhci_writeb(host, val, PHY_SDCLKDL_CNFG_R);
481
482 /* configure phy pads */
483 val = rxsel;
484 val |= FIELD_PREP(PHY_PAD_WEAKPULL_MASK, PHY_PAD_WEAKPULL_PULLUP);
485 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P);
486 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N);
487 sdhci_writew(host, val, PHY_CMDPAD_CNFG_R);
488 sdhci_writew(host, val, PHY_DATAPAD_CNFG_R);
489 sdhci_writew(host, val, PHY_RSTNPAD_CNFG_R);
490
491 val = FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P);
492 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N);
493 sdhci_writew(host, val, PHY_CLKPAD_CNFG_R);
494
495 val = rxsel;
496 val |= FIELD_PREP(PHY_PAD_WEAKPULL_MASK, PHY_PAD_WEAKPULL_PULLDOWN);
497 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P);
498 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N);
499 sdhci_writew(host, val, PHY_STBPAD_CNFG_R);
500
501 /* enable data strobe mode */
502 if (rxsel == PHY_PAD_RXSEL_1V8) {
503 u8 sel = FIELD_PREP(PHY_DLLDL_CNFG_SLV_INPSEL_MASK, PHY_DLLDL_CNFG_SLV_INPSEL);
504
505 sdhci_writeb(host, sel, PHY_DLLDL_CNFG_R);
506 }
507
508 /* enable phy dll */
509 sdhci_writeb(host, PHY_DLL_CTRL_ENABLE, PHY_DLL_CTRL_R);
510
511 }
512
th1520_sdhci_set_phy(struct sdhci_host * host)513 static void th1520_sdhci_set_phy(struct sdhci_host *host)
514 {
515 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
516 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
517 u32 emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO;
518 u16 emmc_ctrl;
519
520 dwcmshc_phy_init(host);
521
522 if ((host->mmc->caps2 & emmc_caps) == emmc_caps) {
523 emmc_ctrl = sdhci_readw(host, priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL);
524 emmc_ctrl |= DWCMSHC_CARD_IS_EMMC;
525 sdhci_writew(host, emmc_ctrl, priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL);
526 }
527
528 sdhci_writeb(host, FIELD_PREP(PHY_DLL_CNFG1_SLVDLY_MASK, PHY_DLL_CNFG1_SLVDLY) |
529 PHY_DLL_CNFG1_WAITCYCLE, PHY_DLL_CNFG1_R);
530 }
531
dwcmshc_set_uhs_signaling(struct sdhci_host * host,unsigned int timing)532 static void dwcmshc_set_uhs_signaling(struct sdhci_host *host,
533 unsigned int timing)
534 {
535 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
536 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
537 u16 ctrl, ctrl_2;
538
539 ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
540 /* Select Bus Speed Mode for host */
541 ctrl_2 &= ~SDHCI_CTRL_UHS_MASK;
542 if ((timing == MMC_TIMING_MMC_HS200) ||
543 (timing == MMC_TIMING_UHS_SDR104))
544 ctrl_2 |= SDHCI_CTRL_UHS_SDR104;
545 else if (timing == MMC_TIMING_UHS_SDR12)
546 ctrl_2 |= SDHCI_CTRL_UHS_SDR12;
547 else if ((timing == MMC_TIMING_UHS_SDR25) ||
548 (timing == MMC_TIMING_MMC_HS))
549 ctrl_2 |= SDHCI_CTRL_UHS_SDR25;
550 else if (timing == MMC_TIMING_UHS_SDR50)
551 ctrl_2 |= SDHCI_CTRL_UHS_SDR50;
552 else if ((timing == MMC_TIMING_UHS_DDR50) ||
553 (timing == MMC_TIMING_MMC_DDR52))
554 ctrl_2 |= SDHCI_CTRL_UHS_DDR50;
555 else if (timing == MMC_TIMING_MMC_HS400) {
556 /* set CARD_IS_EMMC bit to enable Data Strobe for HS400 */
557 ctrl = sdhci_readw(host, priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL);
558 ctrl |= DWCMSHC_CARD_IS_EMMC;
559 sdhci_writew(host, ctrl, priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL);
560
561 ctrl_2 |= DWCMSHC_CTRL_HS400;
562 }
563
564 if (priv->flags & FLAG_IO_FIXED_1V8)
565 ctrl_2 |= SDHCI_CTRL_VDD_180;
566 sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2);
567 }
568
th1520_set_uhs_signaling(struct sdhci_host * host,unsigned int timing)569 static void th1520_set_uhs_signaling(struct sdhci_host *host,
570 unsigned int timing)
571 {
572 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
573 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
574
575 dwcmshc_set_uhs_signaling(host, timing);
576 if (timing == MMC_TIMING_MMC_HS400)
577 priv->delay_line = PHY_SDCLKDL_DC_HS400;
578 else
579 sdhci_writeb(host, 0, PHY_DLLDL_CNFG_R);
580 th1520_sdhci_set_phy(host);
581 }
582
dwcmshc_hs400_enhanced_strobe(struct mmc_host * mmc,struct mmc_ios * ios)583 static void dwcmshc_hs400_enhanced_strobe(struct mmc_host *mmc,
584 struct mmc_ios *ios)
585 {
586 u32 vendor;
587 struct sdhci_host *host = mmc_priv(mmc);
588 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
589 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
590 int reg = priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL;
591
592 vendor = sdhci_readl(host, reg);
593 if (ios->enhanced_strobe)
594 vendor |= DWCMSHC_ENHANCED_STROBE;
595 else
596 vendor &= ~DWCMSHC_ENHANCED_STROBE;
597
598 sdhci_writel(host, vendor, reg);
599 }
600
dwcmshc_execute_tuning(struct mmc_host * mmc,u32 opcode)601 static int dwcmshc_execute_tuning(struct mmc_host *mmc, u32 opcode)
602 {
603 int err = sdhci_execute_tuning(mmc, opcode);
604 struct sdhci_host *host = mmc_priv(mmc);
605
606 if (err)
607 return err;
608
609 /*
610 * Tuning can leave the IP in an active state (Buffer Read Enable bit
611 * set) which prevents the entry to low power states (i.e. S0i3). Data
612 * reset will clear it.
613 */
614 sdhci_reset(host, SDHCI_RESET_DATA);
615
616 return 0;
617 }
618
dwcmshc_cqe_irq_handler(struct sdhci_host * host,u32 intmask)619 static u32 dwcmshc_cqe_irq_handler(struct sdhci_host *host, u32 intmask)
620 {
621 int cmd_error = 0;
622 int data_error = 0;
623
624 if (!sdhci_cqe_irq(host, intmask, &cmd_error, &data_error))
625 return intmask;
626
627 cqhci_irq(host->mmc, intmask, cmd_error, data_error);
628
629 return 0;
630 }
631
dwcmshc_sdhci_cqe_enable(struct mmc_host * mmc)632 static void dwcmshc_sdhci_cqe_enable(struct mmc_host *mmc)
633 {
634 struct sdhci_host *host = mmc_priv(mmc);
635 u8 ctrl;
636
637 sdhci_writew(host, DWCMSHC_SDHCI_CQE_TRNS_MODE, SDHCI_TRANSFER_MODE);
638
639 sdhci_cqe_enable(mmc);
640
641 /*
642 * The "DesignWare Cores Mobile Storage Host Controller
643 * DWC_mshc / DWC_mshc_lite Databook" says:
644 * when Host Version 4 Enable" is 1 in Host Control 2 register,
645 * SDHCI_CTRL_ADMA32 bit means ADMA2 is selected.
646 * Selection of 32-bit/64-bit System Addressing:
647 * either 32-bit or 64-bit system addressing is selected by
648 * 64-bit Addressing bit in Host Control 2 register.
649 *
650 * On the other hand the "DesignWare Cores Mobile Storage Host
651 * Controller DWC_mshc / DWC_mshc_lite User Guide" says, that we have to
652 * set DMA_SEL to ADMA2 _only_ mode in the Host Control 2 register.
653 */
654 ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
655 ctrl &= ~SDHCI_CTRL_DMA_MASK;
656 ctrl |= SDHCI_CTRL_ADMA32;
657 sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
658 }
659
dwcmshc_set_tran_desc(struct cqhci_host * cq_host,u8 ** desc,dma_addr_t addr,int len,bool end,bool dma64)660 static void dwcmshc_set_tran_desc(struct cqhci_host *cq_host, u8 **desc,
661 dma_addr_t addr, int len, bool end, bool dma64)
662 {
663 int tmplen, offset;
664
665 if (likely(!len || BOUNDARY_OK(addr, len))) {
666 cqhci_set_tran_desc(*desc, addr, len, end, dma64);
667 return;
668 }
669
670 offset = addr & (SZ_128M - 1);
671 tmplen = SZ_128M - offset;
672 cqhci_set_tran_desc(*desc, addr, tmplen, false, dma64);
673
674 addr += tmplen;
675 len -= tmplen;
676 *desc += cq_host->trans_desc_len;
677 cqhci_set_tran_desc(*desc, addr, len, end, dma64);
678 }
679
dwcmshc_cqhci_dumpregs(struct mmc_host * mmc)680 static void dwcmshc_cqhci_dumpregs(struct mmc_host *mmc)
681 {
682 sdhci_dumpregs(mmc_priv(mmc));
683 }
684
rk35xx_sdhci_cqe_pre_enable(struct mmc_host * mmc)685 static void rk35xx_sdhci_cqe_pre_enable(struct mmc_host *mmc)
686 {
687 struct sdhci_host *host = mmc_priv(mmc);
688 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
689 struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
690 u32 reg;
691
692 /* Set Send Status Command Idle Timer to 10.66us (256 * 1 / 24) */
693 reg = sdhci_readl(host, dwc_priv->vendor_specific_area2 + CQHCI_SSC1);
694 reg = (reg & ~CQHCI_SSC1_CIT_MASK) | 0x0100;
695 sdhci_writel(host, reg, dwc_priv->vendor_specific_area2 + CQHCI_SSC1);
696
697 reg = sdhci_readl(host, dwc_priv->vendor_specific_area2 + CQHCI_CFG);
698 reg |= CQHCI_ENABLE;
699 sdhci_writel(host, reg, dwc_priv->vendor_specific_area2 + CQHCI_CFG);
700 }
701
rk35xx_sdhci_cqe_enable(struct mmc_host * mmc)702 static void rk35xx_sdhci_cqe_enable(struct mmc_host *mmc)
703 {
704 struct sdhci_host *host = mmc_priv(mmc);
705 u32 reg;
706
707 reg = sdhci_readl(host, SDHCI_PRESENT_STATE);
708 while (reg & SDHCI_DATA_AVAILABLE) {
709 sdhci_readl(host, SDHCI_BUFFER);
710 reg = sdhci_readl(host, SDHCI_PRESENT_STATE);
711 }
712
713 sdhci_writew(host, DWCMSHC_SDHCI_CQE_TRNS_MODE, SDHCI_TRANSFER_MODE);
714
715 sdhci_cqe_enable(mmc);
716 }
717
rk35xx_sdhci_cqe_disable(struct mmc_host * mmc,bool recovery)718 static void rk35xx_sdhci_cqe_disable(struct mmc_host *mmc, bool recovery)
719 {
720 struct sdhci_host *host = mmc_priv(mmc);
721 unsigned long flags;
722 u32 ctrl;
723
724 /*
725 * During CQE command transfers, command complete bit gets latched.
726 * So s/w should clear command complete interrupt status when CQE is
727 * either halted or disabled. Otherwise unexpected SDCHI legacy
728 * interrupt gets triggered when CQE is halted/disabled.
729 */
730 spin_lock_irqsave(&host->lock, flags);
731 ctrl = sdhci_readl(host, SDHCI_INT_ENABLE);
732 ctrl |= SDHCI_INT_RESPONSE;
733 sdhci_writel(host, ctrl, SDHCI_INT_ENABLE);
734 sdhci_writel(host, SDHCI_INT_RESPONSE, SDHCI_INT_STATUS);
735 spin_unlock_irqrestore(&host->lock, flags);
736
737 sdhci_cqe_disable(mmc, recovery);
738 }
739
rk35xx_sdhci_cqe_post_disable(struct mmc_host * mmc)740 static void rk35xx_sdhci_cqe_post_disable(struct mmc_host *mmc)
741 {
742 struct sdhci_host *host = mmc_priv(mmc);
743 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
744 struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
745 u32 ctrl;
746
747 ctrl = sdhci_readl(host, dwc_priv->vendor_specific_area2 + CQHCI_CFG);
748 ctrl &= ~CQHCI_ENABLE;
749 sdhci_writel(host, ctrl, dwc_priv->vendor_specific_area2 + CQHCI_CFG);
750 }
751
dwcmshc_rk3568_set_clock(struct sdhci_host * host,unsigned int clock)752 static void dwcmshc_rk3568_set_clock(struct sdhci_host *host, unsigned int clock)
753 {
754 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
755 struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
756 struct rk35xx_priv *priv = dwc_priv->priv;
757 const struct rockchip_pltfm_data *rockchip_pdata = to_pltfm_data(dwc_priv, rockchip);
758 u8 txclk_tapnum = DLL_TXCLK_TAPNUM_DEFAULT;
759 u32 extra, reg;
760 int err;
761
762 host->mmc->actual_clock = 0;
763
764 if (clock == 0) {
765 /* Disable interface clock at initial state. */
766 sdhci_set_clock(host, clock);
767 return;
768 }
769
770 /* Rockchip platform only support 375KHz for identify mode */
771 if (clock <= 400000)
772 clock = 375000;
773
774 err = clk_set_rate(pltfm_host->clk, clock);
775 if (err)
776 dev_err(mmc_dev(host->mmc), "fail to set clock %d", clock);
777
778 sdhci_set_clock(host, clock);
779
780 /* Disable cmd conflict check and internal clock gate */
781 reg = dwc_priv->vendor_specific_area1 + DWCMSHC_HOST_CTRL3;
782 extra = sdhci_readl(host, reg);
783 extra &= ~BIT(0);
784 extra |= BIT(4);
785 sdhci_writel(host, extra, reg);
786
787 /* Disable clock while config DLL */
788 sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
789
790 if (clock <= 52000000) {
791 if (host->mmc->ios.timing == MMC_TIMING_MMC_HS200 ||
792 host->mmc->ios.timing == MMC_TIMING_MMC_HS400) {
793 dev_err(mmc_dev(host->mmc),
794 "Can't reduce the clock below 52MHz in HS200/HS400 mode");
795 goto enable_clk;
796 }
797
798 /*
799 * Disable DLL and reset both of sample and drive clock.
800 * The bypass bit and start bit need to be set if DLL is not locked.
801 */
802 sdhci_writel(host, DWCMSHC_EMMC_DLL_BYPASS | DWCMSHC_EMMC_DLL_START, DWCMSHC_EMMC_DLL_CTRL);
803 sdhci_writel(host, DLL_RXCLK_ORI_GATE, DWCMSHC_EMMC_DLL_RXCLK);
804 sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_TXCLK);
805 sdhci_writel(host, 0, DECMSHC_EMMC_DLL_CMDOUT);
806 /*
807 * Before switching to hs400es mode, the driver will enable
808 * enhanced strobe first. PHY needs to configure the parameters
809 * of enhanced strobe first.
810 */
811 extra = DWCMSHC_EMMC_DLL_DLYENA |
812 DLL_STRBIN_DELAY_NUM_SEL |
813 DLL_STRBIN_DELAY_NUM_DEFAULT << DLL_STRBIN_DELAY_NUM_OFFSET;
814 sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_STRBIN);
815 goto enable_clk;
816 }
817
818 /* Reset DLL */
819 sdhci_writel(host, BIT(1), DWCMSHC_EMMC_DLL_CTRL);
820 udelay(1);
821 sdhci_writel(host, 0x0, DWCMSHC_EMMC_DLL_CTRL);
822
823 /*
824 * We shouldn't set DLL_RXCLK_NO_INVERTER for identify mode but
825 * we must set it in higher speed mode.
826 */
827 extra = DWCMSHC_EMMC_DLL_DLYENA;
828 if (rockchip_pdata->revision == 0)
829 extra |= DLL_RXCLK_NO_INVERTER << DWCMSHC_EMMC_DLL_RXCLK_SRCSEL;
830 sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_RXCLK);
831
832 /* Init DLL settings */
833 extra = 0x5 << DWCMSHC_EMMC_DLL_START_POINT |
834 0x2 << DWCMSHC_EMMC_DLL_INC |
835 DWCMSHC_EMMC_DLL_START;
836 sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_CTRL);
837 err = readl_poll_timeout(host->ioaddr + DWCMSHC_EMMC_DLL_STATUS0,
838 extra, DLL_LOCK_WO_TMOUT(extra), 1,
839 500 * USEC_PER_MSEC);
840 if (err) {
841 dev_err(mmc_dev(host->mmc), "DLL lock timeout!\n");
842 goto enable_clk;
843 }
844
845 extra = 0x1 << 16 | /* tune clock stop en */
846 0x3 << 17 | /* pre-change delay */
847 0x3 << 19; /* post-change delay */
848 sdhci_writel(host, extra, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
849
850 if (host->mmc->ios.timing == MMC_TIMING_MMC_HS200 ||
851 host->mmc->ios.timing == MMC_TIMING_MMC_HS400)
852 txclk_tapnum = priv->txclk_tapnum;
853
854 if (rockchip_pdata->revision == 1 && host->mmc->ios.timing == MMC_TIMING_MMC_HS400) {
855 txclk_tapnum = DLL_TXCLK_TAPNUM_90_DEGREES;
856
857 extra = DLL_CMDOUT_SRC_CLK_NEG |
858 DLL_CMDOUT_EN_SRC_CLK_NEG |
859 DWCMSHC_EMMC_DLL_DLYENA |
860 DLL_CMDOUT_TAPNUM_90_DEGREES |
861 DLL_CMDOUT_TAPNUM_FROM_SW;
862 sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT);
863 }
864
865 extra = DWCMSHC_EMMC_DLL_DLYENA |
866 DLL_TXCLK_TAPNUM_FROM_SW |
867 DLL_RXCLK_NO_INVERTER << DWCMSHC_EMMC_DLL_RXCLK_SRCSEL |
868 txclk_tapnum;
869 sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_TXCLK);
870
871 extra = DWCMSHC_EMMC_DLL_DLYENA |
872 DLL_STRBIN_TAPNUM_DEFAULT |
873 DLL_STRBIN_TAPNUM_FROM_SW;
874 sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_STRBIN);
875
876 enable_clk:
877 /*
878 * The sdclk frequency select bits in SDHCI_CLOCK_CONTROL are not functional
879 * on Rockchip's SDHCI implementation. Instead, the clock frequency is fully
880 * controlled via external clk provider by calling clk_set_rate(). Consequently,
881 * passing 0 to sdhci_enable_clk() only re-enables the already-configured clock,
882 * which matches the hardware's actual behavior.
883 */
884 sdhci_enable_clk(host, 0);
885 }
886
rk35xx_sdhci_reset(struct sdhci_host * host,u8 mask)887 static void rk35xx_sdhci_reset(struct sdhci_host *host, u8 mask)
888 {
889 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
890 struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
891 struct rk35xx_priv *priv = dwc_priv->priv;
892 u32 extra = sdhci_readl(host, DECMSHC_EMMC_MISC_CON);
893
894 if ((host->mmc->caps2 & MMC_CAP2_CQE) && (mask & SDHCI_RESET_ALL))
895 cqhci_deactivate(host->mmc);
896
897 if (mask & SDHCI_RESET_ALL && priv->reset) {
898 reset_control_assert(priv->reset);
899 udelay(1);
900 reset_control_deassert(priv->reset);
901 }
902
903 sdhci_reset(host, mask);
904
905 /* Enable INTERNAL CLOCK */
906 sdhci_writel(host, MISC_INTCLK_EN | extra, DECMSHC_EMMC_MISC_CON);
907 }
908
dwcmshc_rk35xx_init(struct device * dev,struct sdhci_host * host,struct dwcmshc_priv * dwc_priv)909 static int dwcmshc_rk35xx_init(struct device *dev, struct sdhci_host *host,
910 struct dwcmshc_priv *dwc_priv)
911 {
912 static const char * const clk_ids[] = {"axi", "block", "timer"};
913 struct rk35xx_priv *priv;
914 int err;
915
916 priv = devm_kzalloc(dev, sizeof(struct rk35xx_priv), GFP_KERNEL);
917 if (!priv)
918 return -ENOMEM;
919
920 priv->reset = devm_reset_control_array_get_optional_exclusive(mmc_dev(host->mmc));
921 if (IS_ERR(priv->reset)) {
922 err = PTR_ERR(priv->reset);
923 dev_err(mmc_dev(host->mmc), "failed to get reset control %d\n", err);
924 return err;
925 }
926
927 err = dwcmshc_get_enable_other_clks(mmc_dev(host->mmc), dwc_priv,
928 ARRAY_SIZE(clk_ids), clk_ids);
929 if (err)
930 return err;
931
932 if (of_property_read_u8(mmc_dev(host->mmc)->of_node, "rockchip,txclk-tapnum",
933 &priv->txclk_tapnum))
934 priv->txclk_tapnum = DLL_TXCLK_TAPNUM_DEFAULT;
935
936 /* Disable cmd conflict check */
937 sdhci_writel(host, 0x0, dwc_priv->vendor_specific_area1 + DWCMSHC_HOST_CTRL3);
938 /* Reset previous settings */
939 sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_TXCLK);
940 sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_STRBIN);
941
942 dwc_priv->priv = priv;
943
944 return 0;
945 }
946
dwcmshc_rk35xx_postinit(struct sdhci_host * host,struct dwcmshc_priv * dwc_priv)947 static void dwcmshc_rk35xx_postinit(struct sdhci_host *host, struct dwcmshc_priv *dwc_priv)
948 {
949 /*
950 * Don't support highspeed bus mode with low clk speed as we
951 * cannot use DLL for this condition.
952 */
953 if (host->mmc->f_max <= 52000000) {
954 dev_info(mmc_dev(host->mmc), "Disabling HS200/HS400, frequency too low (%d)\n",
955 host->mmc->f_max);
956 host->mmc->caps2 &= ~(MMC_CAP2_HS200 | MMC_CAP2_HS400);
957 host->mmc->caps &= ~(MMC_CAP_3_3V_DDR | MMC_CAP_1_8V_DDR);
958 }
959 }
960
dwcmshc_rk3576_postinit(struct sdhci_host * host,struct dwcmshc_priv * dwc_priv)961 static void dwcmshc_rk3576_postinit(struct sdhci_host *host, struct dwcmshc_priv *dwc_priv)
962 {
963 struct device *dev = mmc_dev(host->mmc);
964 int ret;
965
966 /*
967 * This works around the design of the RK3576's power domains, which
968 * makes the PD_NVM power domain, which the sdhci controller on the
969 * RK3576 is in, never come back the same way once it's run-time
970 * suspended once. This can happen during early kernel boot if no driver
971 * is using either PD_NVM or its child power domain PD_SDGMAC for a
972 * short moment, leading to it being turned off to save power. By
973 * keeping it on, sdhci suspending won't lead to PD_NVM becoming a
974 * candidate for getting turned off.
975 */
976 ret = dev_pm_genpd_rpm_always_on(dev, true);
977 if (ret && ret != -EOPNOTSUPP)
978 dev_warn(dev, "failed to set PD rpm always on, SoC may hang later: %pe\n",
979 ERR_PTR(ret));
980
981 dwcmshc_rk35xx_postinit(host, dwc_priv);
982 }
983
th1520_execute_tuning(struct sdhci_host * host,u32 opcode)984 static int th1520_execute_tuning(struct sdhci_host *host, u32 opcode)
985 {
986 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
987 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
988 u32 val = 0;
989
990 if (host->flags & SDHCI_HS400_TUNING)
991 return 0;
992
993 sdhci_writeb(host, FIELD_PREP(PHY_ATDL_CNFG_INPSEL_MASK, PHY_ATDL_CNFG_INPSEL),
994 PHY_ATDL_CNFG_R);
995 val = sdhci_readl(host, priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
996
997 /*
998 * configure tuning settings:
999 * - center phase select code driven in block gap interval
1000 * - disable reporting of framing errors
1001 * - disable software managed tuning
1002 * - disable user selection of sampling window edges,
1003 * instead tuning calculated edges are used
1004 */
1005 val &= ~(AT_CTRL_CI_SEL | AT_CTRL_RPT_TUNE_ERR | AT_CTRL_SW_TUNE_EN |
1006 FIELD_PREP(AT_CTRL_WIN_EDGE_SEL_MASK, AT_CTRL_WIN_EDGE_SEL));
1007
1008 /*
1009 * configure tuning settings:
1010 * - enable auto-tuning
1011 * - enable sampling window threshold
1012 * - stop clocks during phase code change
1013 * - set max latency in cycles between tx and rx clocks
1014 * - set max latency in cycles to switch output phase
1015 * - set max sampling window threshold value
1016 */
1017 val |= AT_CTRL_AT_EN | AT_CTRL_SWIN_TH_EN | AT_CTRL_TUNE_CLK_STOP_EN;
1018 val |= FIELD_PREP(AT_CTRL_PRE_CHANGE_DLY_MASK, AT_CTRL_PRE_CHANGE_DLY);
1019 val |= FIELD_PREP(AT_CTRL_POST_CHANGE_DLY_MASK, AT_CTRL_POST_CHANGE_DLY);
1020 val |= FIELD_PREP(AT_CTRL_SWIN_TH_VAL_MASK, AT_CTRL_SWIN_TH_VAL);
1021
1022 sdhci_writel(host, val, priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
1023 val = sdhci_readl(host, priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
1024
1025 /* perform tuning */
1026 sdhci_start_tuning(host);
1027 host->tuning_loop_count = 128;
1028 host->tuning_err = __sdhci_execute_tuning(host, opcode);
1029 if (host->tuning_err) {
1030 /* disable auto-tuning upon tuning error */
1031 val &= ~AT_CTRL_AT_EN;
1032 sdhci_writel(host, val, priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
1033 dev_err(mmc_dev(host->mmc), "tuning failed: %d\n", host->tuning_err);
1034 return -EIO;
1035 }
1036 sdhci_end_tuning(host);
1037
1038 return 0;
1039 }
1040
th1520_sdhci_reset(struct sdhci_host * host,u8 mask)1041 static void th1520_sdhci_reset(struct sdhci_host *host, u8 mask)
1042 {
1043 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1044 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
1045 u16 ctrl_2;
1046
1047 dwcmshc_reset(host, mask);
1048
1049 if (priv->flags & FLAG_IO_FIXED_1V8) {
1050 ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
1051 if (!(ctrl_2 & SDHCI_CTRL_VDD_180)) {
1052 ctrl_2 |= SDHCI_CTRL_VDD_180;
1053 sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2);
1054 }
1055 }
1056 }
1057
th1520_init(struct device * dev,struct sdhci_host * host,struct dwcmshc_priv * dwc_priv)1058 static int th1520_init(struct device *dev,
1059 struct sdhci_host *host,
1060 struct dwcmshc_priv *dwc_priv)
1061 {
1062 dwc_priv->delay_line = PHY_SDCLKDL_DC_DEFAULT;
1063
1064 if (device_property_read_bool(dev, "mmc-ddr-1_8v") ||
1065 device_property_read_bool(dev, "mmc-hs200-1_8v") ||
1066 device_property_read_bool(dev, "mmc-hs400-1_8v"))
1067 dwc_priv->flags |= FLAG_IO_FIXED_1V8;
1068 else
1069 dwc_priv->flags &= ~FLAG_IO_FIXED_1V8;
1070
1071 /*
1072 * start_signal_voltage_switch() will try 3.3V first
1073 * then 1.8V. Use SDHCI_SIGNALING_180 rather than
1074 * SDHCI_SIGNALING_330 to avoid setting voltage to 3.3V
1075 * in sdhci_start_signal_voltage_switch().
1076 */
1077 if (dwc_priv->flags & FLAG_IO_FIXED_1V8) {
1078 host->flags &= ~SDHCI_SIGNALING_330;
1079 host->flags |= SDHCI_SIGNALING_180;
1080 }
1081
1082 sdhci_enable_v4_mode(host);
1083
1084 return 0;
1085 }
1086
cv18xx_sdhci_reset(struct sdhci_host * host,u8 mask)1087 static void cv18xx_sdhci_reset(struct sdhci_host *host, u8 mask)
1088 {
1089 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1090 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
1091 u32 val, emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO;
1092
1093 dwcmshc_reset(host, mask);
1094
1095 if ((host->mmc->caps2 & emmc_caps) == emmc_caps) {
1096 val = sdhci_readl(host, priv->vendor_specific_area1 + CV18XX_SDHCI_MSHC_CTRL);
1097 val |= CV18XX_EMMC_FUNC_EN;
1098 sdhci_writel(host, val, priv->vendor_specific_area1 + CV18XX_SDHCI_MSHC_CTRL);
1099 }
1100
1101 val = sdhci_readl(host, priv->vendor_specific_area1 + CV18XX_SDHCI_MSHC_CTRL);
1102 val |= CV18XX_LATANCY_1T;
1103 sdhci_writel(host, val, priv->vendor_specific_area1 + CV18XX_SDHCI_MSHC_CTRL);
1104
1105 val = sdhci_readl(host, priv->vendor_specific_area1 + CV18XX_SDHCI_PHY_CONFIG);
1106 val |= CV18XX_PHY_TX_BPS;
1107 sdhci_writel(host, val, priv->vendor_specific_area1 + CV18XX_SDHCI_PHY_CONFIG);
1108
1109 val = (FIELD_PREP(CV18XX_PHY_TX_DLY_MSK, 0) |
1110 FIELD_PREP(CV18XX_PHY_TX_SRC_MSK, CV18XX_PHY_TX_SRC_INVERT_CLK_TX) |
1111 FIELD_PREP(CV18XX_PHY_RX_DLY_MSK, 0) |
1112 FIELD_PREP(CV18XX_PHY_RX_SRC_MSK, CV18XX_PHY_RX_SRC_INVERT_RX_CLK));
1113 sdhci_writel(host, val, priv->vendor_specific_area1 + CV18XX_SDHCI_PHY_TX_RX_DLY);
1114 }
1115
cv18xx_sdhci_set_tap(struct sdhci_host * host,int tap)1116 static void cv18xx_sdhci_set_tap(struct sdhci_host *host, int tap)
1117 {
1118 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1119 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
1120 u16 clk;
1121 u32 val;
1122
1123 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
1124 clk &= ~SDHCI_CLOCK_CARD_EN;
1125 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
1126
1127 val = sdhci_readl(host, priv->vendor_specific_area1 + CV18XX_SDHCI_MSHC_CTRL);
1128 val &= ~CV18XX_LATANCY_1T;
1129 sdhci_writel(host, val, priv->vendor_specific_area1 + CV18XX_SDHCI_MSHC_CTRL);
1130
1131 val = (FIELD_PREP(CV18XX_PHY_TX_DLY_MSK, 0) |
1132 FIELD_PREP(CV18XX_PHY_TX_SRC_MSK, CV18XX_PHY_TX_SRC_INVERT_CLK_TX) |
1133 FIELD_PREP(CV18XX_PHY_RX_DLY_MSK, tap));
1134 sdhci_writel(host, val, priv->vendor_specific_area1 + CV18XX_SDHCI_PHY_TX_RX_DLY);
1135
1136 sdhci_writel(host, 0, priv->vendor_specific_area1 + CV18XX_SDHCI_PHY_CONFIG);
1137
1138 clk |= SDHCI_CLOCK_CARD_EN;
1139 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
1140 usleep_range(1000, 2000);
1141 }
1142
cv18xx_retry_tuning(struct mmc_host * mmc,u32 opcode,int * cmd_error)1143 static int cv18xx_retry_tuning(struct mmc_host *mmc, u32 opcode, int *cmd_error)
1144 {
1145 int ret, retry = 0;
1146
1147 while (retry < CV18XX_RETRY_TUNING_MAX) {
1148 ret = mmc_send_tuning(mmc, opcode, NULL);
1149 if (ret)
1150 return ret;
1151 retry++;
1152 }
1153
1154 return 0;
1155 }
1156
cv18xx_sdhci_post_tuning(struct sdhci_host * host)1157 static void cv18xx_sdhci_post_tuning(struct sdhci_host *host)
1158 {
1159 u32 val;
1160
1161 val = sdhci_readl(host, SDHCI_INT_STATUS);
1162 val |= SDHCI_INT_DATA_AVAIL;
1163 sdhci_writel(host, val, SDHCI_INT_STATUS);
1164
1165 dwcmshc_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
1166 }
1167
cv18xx_sdhci_execute_tuning(struct sdhci_host * host,u32 opcode)1168 static int cv18xx_sdhci_execute_tuning(struct sdhci_host *host, u32 opcode)
1169 {
1170 int min, max, avg, ret;
1171 int win_length, target_min, target_max, target_win_length;
1172
1173 min = max = 0;
1174 target_win_length = 0;
1175
1176 sdhci_reset_tuning(host);
1177
1178 while (max < CV18XX_TUNE_MAX) {
1179 /* find the mininum delay first which can pass tuning */
1180 while (min < CV18XX_TUNE_MAX) {
1181 cv18xx_sdhci_set_tap(host, min);
1182 if (!cv18xx_retry_tuning(host->mmc, opcode, NULL))
1183 break;
1184 min += CV18XX_TUNE_STEP;
1185 }
1186
1187 /* find the maxinum delay which can not pass tuning */
1188 max = min + CV18XX_TUNE_STEP;
1189 while (max < CV18XX_TUNE_MAX) {
1190 cv18xx_sdhci_set_tap(host, max);
1191 if (cv18xx_retry_tuning(host->mmc, opcode, NULL)) {
1192 max -= CV18XX_TUNE_STEP;
1193 break;
1194 }
1195 max += CV18XX_TUNE_STEP;
1196 }
1197
1198 win_length = max - min + 1;
1199 /* get the largest pass window */
1200 if (win_length > target_win_length) {
1201 target_win_length = win_length;
1202 target_min = min;
1203 target_max = max;
1204 }
1205
1206 /* continue to find the next pass window */
1207 min = max + CV18XX_TUNE_STEP;
1208 }
1209
1210 cv18xx_sdhci_post_tuning(host);
1211
1212 /* use average delay to get the best timing */
1213 avg = (target_min + target_max) / 2;
1214 cv18xx_sdhci_set_tap(host, avg);
1215 ret = mmc_send_tuning(host->mmc, opcode, NULL);
1216
1217 dev_dbg(mmc_dev(host->mmc), "tuning %s at 0x%x ret %d\n",
1218 ret ? "failed" : "passed", avg, ret);
1219
1220 return ret;
1221 }
1222
sg2042_sdhci_phy_init(struct sdhci_host * host)1223 static inline void sg2042_sdhci_phy_init(struct sdhci_host *host)
1224 {
1225 u32 val;
1226
1227 /* Asset phy reset & set tx drive strength */
1228 val = sdhci_readl(host, PHY_CNFG_R);
1229 val &= ~PHY_CNFG_RSTN_DEASSERT;
1230 val |= FIELD_PREP(PHY_CNFG_PHY_PWRGOOD_MASK, 1);
1231 val |= FIELD_PREP(PHY_CNFG_PAD_SP_MASK, PHY_CNFG_PAD_SP_SG2042);
1232 val |= FIELD_PREP(PHY_CNFG_PAD_SN_MASK, PHY_CNFG_PAD_SN_SG2042);
1233 sdhci_writel(host, val, PHY_CNFG_R);
1234
1235 /* Configure phy pads */
1236 val = PHY_PAD_RXSEL_3V3;
1237 val |= FIELD_PREP(PHY_PAD_WEAKPULL_MASK, PHY_PAD_WEAKPULL_PULLUP);
1238 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P);
1239 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N_SG2042);
1240 sdhci_writew(host, val, PHY_CMDPAD_CNFG_R);
1241 sdhci_writew(host, val, PHY_DATAPAD_CNFG_R);
1242 sdhci_writew(host, val, PHY_RSTNPAD_CNFG_R);
1243
1244 val = PHY_PAD_RXSEL_3V3;
1245 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P);
1246 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N_SG2042);
1247 sdhci_writew(host, val, PHY_CLKPAD_CNFG_R);
1248
1249 val = PHY_PAD_RXSEL_3V3;
1250 val |= FIELD_PREP(PHY_PAD_WEAKPULL_MASK, PHY_PAD_WEAKPULL_PULLDOWN);
1251 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P);
1252 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N_SG2042);
1253 sdhci_writew(host, val, PHY_STBPAD_CNFG_R);
1254
1255 /* Configure delay line */
1256 /* Enable fixed delay */
1257 sdhci_writeb(host, PHY_SDCLKDL_CNFG_EXTDLY_EN, PHY_SDCLKDL_CNFG_R);
1258 /*
1259 * Set delay line.
1260 * Its recommended that bit UPDATE_DC[4] is 1 when SDCLKDL_DC is being written.
1261 * Ensure UPDATE_DC[4] is '0' when not updating code.
1262 */
1263 val = sdhci_readb(host, PHY_SDCLKDL_CNFG_R);
1264 val |= PHY_SDCLKDL_CNFG_UPDATE;
1265 sdhci_writeb(host, val, PHY_SDCLKDL_CNFG_R);
1266 /* Add 10 * 70ps = 0.7ns for output delay */
1267 sdhci_writeb(host, 10, PHY_SDCLKDL_DC_R);
1268 val = sdhci_readb(host, PHY_SDCLKDL_CNFG_R);
1269 val &= ~(PHY_SDCLKDL_CNFG_UPDATE);
1270 sdhci_writeb(host, val, PHY_SDCLKDL_CNFG_R);
1271
1272 /* Set SMPLDL_CNFG, Bypass */
1273 sdhci_writeb(host, PHY_SMPLDL_CNFG_BYPASS_EN, PHY_SMPLDL_CNFG_R);
1274
1275 /* Set ATDL_CNFG, tuning clk not use for init */
1276 val = FIELD_PREP(PHY_ATDL_CNFG_INPSEL_MASK, PHY_ATDL_CNFG_INPSEL_SG2042);
1277 sdhci_writeb(host, val, PHY_ATDL_CNFG_R);
1278
1279 /* Deasset phy reset */
1280 val = sdhci_readl(host, PHY_CNFG_R);
1281 val |= PHY_CNFG_RSTN_DEASSERT;
1282 sdhci_writel(host, val, PHY_CNFG_R);
1283 }
1284
sg2042_sdhci_reset(struct sdhci_host * host,u8 mask)1285 static void sg2042_sdhci_reset(struct sdhci_host *host, u8 mask)
1286 {
1287 sdhci_reset(host, mask);
1288
1289 if (mask & SDHCI_RESET_ALL)
1290 sg2042_sdhci_phy_init(host);
1291 }
1292
sg2042_init(struct device * dev,struct sdhci_host * host,struct dwcmshc_priv * dwc_priv)1293 static int sg2042_init(struct device *dev, struct sdhci_host *host,
1294 struct dwcmshc_priv *dwc_priv)
1295 {
1296 static const char * const clk_ids[] = {"timer"};
1297
1298 return dwcmshc_get_enable_other_clks(mmc_dev(host->mmc), dwc_priv,
1299 ARRAY_SIZE(clk_ids), clk_ids);
1300 }
1301
1302 /*
1303 * HPE GSC-specific vendor configuration: disable command conflict check
1304 * and program Auto-Tuning Control register.
1305 */
dwcmshc_hpe_vendor_specific(struct sdhci_host * host)1306 static void dwcmshc_hpe_vendor_specific(struct sdhci_host *host)
1307 {
1308 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1309 struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
1310 u32 atctrl;
1311 u8 extra;
1312
1313 extra = sdhci_readb(host, dwc_priv->vendor_specific_area1 + DWCMSHC_HOST_CTRL3);
1314 extra &= ~DWCMSHC_HOST_CTRL3_CMD_CONFLICT;
1315 sdhci_writeb(host, extra, dwc_priv->vendor_specific_area1 + DWCMSHC_HOST_CTRL3);
1316
1317 atctrl = AT_CTRL_AT_EN | AT_CTRL_SWIN_TH_EN | AT_CTRL_TUNE_CLK_STOP_EN |
1318 FIELD_PREP(AT_CTRL_PRE_CHANGE_DLY_MASK, 3) |
1319 FIELD_PREP(AT_CTRL_POST_CHANGE_DLY_MASK, AT_CTRL_POST_CHANGE_DLY) |
1320 FIELD_PREP(AT_CTRL_SWIN_TH_VAL_MASK, 2);
1321 sdhci_writel(host, atctrl, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
1322 }
1323
dwcmshc_hpe_set_emmc(struct sdhci_host * host)1324 static void dwcmshc_hpe_set_emmc(struct sdhci_host *host)
1325 {
1326 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1327 struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
1328 u16 ctrl;
1329
1330 ctrl = sdhci_readw(host, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL);
1331 ctrl |= DWCMSHC_CARD_IS_EMMC;
1332 sdhci_writew(host, ctrl, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL);
1333 }
1334
dwcmshc_hpe_reset(struct sdhci_host * host,u8 mask)1335 static void dwcmshc_hpe_reset(struct sdhci_host *host, u8 mask)
1336 {
1337 dwcmshc_reset(host, mask);
1338 dwcmshc_hpe_vendor_specific(host);
1339 dwcmshc_hpe_set_emmc(host);
1340 }
1341
dwcmshc_hpe_set_uhs_signaling(struct sdhci_host * host,unsigned int timing)1342 static void dwcmshc_hpe_set_uhs_signaling(struct sdhci_host *host, unsigned int timing)
1343 {
1344 dwcmshc_set_uhs_signaling(host, timing);
1345 dwcmshc_hpe_set_emmc(host);
1346 }
1347
1348 /*
1349 * HPE GSC eMMC controller clock setup.
1350 *
1351 * The GSC SoC wires the freq_sel field of SDHCI_CLOCK_CONTROL directly to a
1352 * clock mux rather than a divider. Force freq_sel = 1 when running at
1353 * 200 MHz (HS200) so the mux selects the correct clock source.
1354 */
dwcmshc_hpe_set_clock(struct sdhci_host * host,unsigned int clock)1355 static void dwcmshc_hpe_set_clock(struct sdhci_host *host, unsigned int clock)
1356 {
1357 u16 clk;
1358
1359 host->mmc->actual_clock = 0;
1360
1361 sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
1362
1363 if (clock == 0)
1364 return;
1365
1366 clk = sdhci_calc_clk(host, clock, &host->mmc->actual_clock);
1367
1368 if (host->mmc->actual_clock == 200000000)
1369 clk |= (1 << SDHCI_DIVIDER_SHIFT);
1370
1371 sdhci_enable_clk(host, clk);
1372 }
1373
1374 /*
1375 * HPE GSC eMMC controller init.
1376 *
1377 * The GSC SoC requires configuring MSHCCS. Bit 18 (SCGSyncDis) disables clock
1378 * synchronisation for phase-select values going to the HS200 RX delay lines,
1379 * allowing the card clock to be stopped while the delay selection settles and
1380 * the phase shift is applied. This must be used together with the ATCTRL
1381 * settings programmed in dwcmshc_hpe_vendor_specific():
1382 * AT_CTRL_R.TUNE_CLK_STOP_EN = 0x1
1383 * AT_CTRL_R.POST_CHANGE_DLY = 0x3
1384 * AT_CTRL_R.PRE_CHANGE_DLY = 0x3
1385 *
1386 * The DTS node provides a syscon phandle ('hpe,gxp-sysreg') with the
1387 * MSHCCS register offset as an argument.
1388 */
dwcmshc_hpe_gsc_init(struct device * dev,struct sdhci_host * host,struct dwcmshc_priv * dwc_priv)1389 static int dwcmshc_hpe_gsc_init(struct device *dev, struct sdhci_host *host,
1390 struct dwcmshc_priv *dwc_priv)
1391 {
1392 unsigned int reg_offset;
1393 struct regmap *soc_ctrl;
1394 int ret;
1395
1396 /* Disable cmd conflict check and configure auto-tuning */
1397 dwcmshc_hpe_vendor_specific(host);
1398
1399 /* Look up the GXP sysreg syscon and MSHCCS offset */
1400 soc_ctrl = syscon_regmap_lookup_by_phandle_args(dev->of_node,
1401 "hpe,gxp-sysreg",
1402 1, ®_offset);
1403 if (IS_ERR(soc_ctrl)) {
1404 dev_err(dev, "failed to get hpe,gxp-sysreg syscon\n");
1405 return PTR_ERR(soc_ctrl);
1406 }
1407
1408 /* Set SCGSyncDis (bit 18) to disable sync on HS200 RX delay lines */
1409 ret = regmap_update_bits(soc_ctrl, reg_offset,
1410 HPE_GSC_MSHCCS_SCGSYNCDIS,
1411 HPE_GSC_MSHCCS_SCGSYNCDIS);
1412 if (ret) {
1413 dev_err(dev, "failed to set SCGSyncDis in MSHCCS\n");
1414 return ret;
1415 }
1416
1417 sdhci_enable_v4_mode(host);
1418
1419 return 0;
1420 }
1421
sdhci_eic7700_set_clock(struct sdhci_host * host,unsigned int clock)1422 static void sdhci_eic7700_set_clock(struct sdhci_host *host, unsigned int clock)
1423 {
1424 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1425 u16 clk;
1426
1427 host->mmc->actual_clock = clock;
1428
1429 if (clock == 0) {
1430 sdhci_set_clock(host, clock);
1431 return;
1432 }
1433
1434 clk_set_rate(pltfm_host->clk, clock);
1435
1436 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
1437 sdhci_enable_clk(host, clk);
1438 }
1439
sdhci_eic7700_config_phy_delay(struct sdhci_host * host,int delay)1440 static void sdhci_eic7700_config_phy_delay(struct sdhci_host *host, int delay)
1441 {
1442 delay &= PHY_CLK_MAX_DELAY_MASK;
1443
1444 /* phy clk delay line config */
1445 sdhci_writeb(host, PHY_SDCLKDL_CNFG_UPDATE, PHY_SDCLKDL_CNFG_R);
1446 sdhci_writeb(host, delay, PHY_SDCLKDL_DC_R);
1447 sdhci_writeb(host, 0x0, PHY_SDCLKDL_CNFG_R);
1448 }
1449
sdhci_eic7700_config_phy(struct sdhci_host * host)1450 static void sdhci_eic7700_config_phy(struct sdhci_host *host)
1451 {
1452 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1453 struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
1454 u32 emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO;
1455 struct eic7700_priv *priv = dwc_priv->priv;
1456 unsigned int val, drv;
1457
1458 drv = FIELD_PREP(PHY_CNFG_PAD_SP_MASK, priv->drive_impedance & 0xF);
1459 drv |= FIELD_PREP(PHY_CNFG_PAD_SN_MASK, (priv->drive_impedance >> 4) & 0xF);
1460
1461 if ((host->mmc->caps2 & emmc_caps) == emmc_caps) {
1462 val = sdhci_readw(host, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL);
1463 val |= DWCMSHC_CARD_IS_EMMC;
1464 sdhci_writew(host, val, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL);
1465 }
1466
1467 /* reset phy, config phy's pad */
1468 sdhci_writel(host, drv | ~PHY_CNFG_RSTN_DEASSERT, PHY_CNFG_R);
1469
1470 /* configure phy pads */
1471 val = FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_N_SG2042);
1472 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N_SG2042);
1473 val |= FIELD_PREP(PHY_PAD_WEAKPULL_MASK, PHY_PAD_WEAKPULL_PULLUP);
1474 val |= PHY_PAD_RXSEL_1V8;
1475 sdhci_writew(host, val, PHY_CMDPAD_CNFG_R);
1476 sdhci_writew(host, val, PHY_DATAPAD_CNFG_R);
1477 sdhci_writew(host, val, PHY_RSTNPAD_CNFG_R);
1478
1479 /* Clock PAD Setting */
1480 val = FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_N_SG2042);
1481 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N_SG2042);
1482 sdhci_writew(host, val, PHY_CLKPAD_CNFG_R);
1483
1484 /* PHY strobe PAD setting (EMMC only) */
1485 if ((host->mmc->caps2 & emmc_caps) == emmc_caps) {
1486 val = FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_N_SG2042);
1487 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N_SG2042);
1488 val |= PHY_PAD_RXSEL_1V8;
1489 sdhci_writew(host, val, PHY_STBPAD_CNFG_R);
1490 }
1491 usleep_range(2000, 3000);
1492 sdhci_writel(host, drv | PHY_CNFG_RSTN_DEASSERT, PHY_CNFG_R);
1493 sdhci_eic7700_config_phy_delay(host, dwc_priv->delay_line);
1494 }
1495
sdhci_eic7700_reset(struct sdhci_host * host,u8 mask)1496 static void sdhci_eic7700_reset(struct sdhci_host *host, u8 mask)
1497 {
1498 dwcmshc_reset(host, mask);
1499
1500 /* after reset all, the phy's config will be clear */
1501 if (mask == SDHCI_RESET_ALL)
1502 sdhci_eic7700_config_phy(host);
1503 }
1504
sdhci_eic7700_reset_init(struct device * dev,struct eic7700_priv * priv)1505 static int sdhci_eic7700_reset_init(struct device *dev, struct eic7700_priv *priv)
1506 {
1507 int ret;
1508
1509 priv->reset = devm_reset_control_array_get_optional_exclusive(dev);
1510 if (IS_ERR(priv->reset)) {
1511 ret = PTR_ERR(priv->reset);
1512 dev_err(dev, "failed to get reset control %d\n", ret);
1513 return ret;
1514 }
1515
1516 ret = reset_control_assert(priv->reset);
1517 if (ret) {
1518 dev_err(dev, "Failed to assert reset signals: %d\n", ret);
1519 return ret;
1520 }
1521 usleep_range(2000, 2100);
1522 ret = reset_control_deassert(priv->reset);
1523 if (ret) {
1524 dev_err(dev, "Failed to deassert reset signals: %d\n", ret);
1525 return ret;
1526 }
1527
1528 return ret;
1529 }
1530
eic7700_convert_drive_impedance_ohm(struct device * dev,unsigned int dr_ohm)1531 static unsigned int eic7700_convert_drive_impedance_ohm(struct device *dev, unsigned int dr_ohm)
1532 {
1533 switch (dr_ohm) {
1534 case 100:
1535 return PHYCTRL_DR_100OHM;
1536 case 66:
1537 return PHYCTRL_DR_66OHM;
1538 case 50:
1539 return PHYCTRL_DR_50OHM;
1540 case 40:
1541 return PHYCTRL_DR_40OHM;
1542 case 33:
1543 return PHYCTRL_DR_33OHM;
1544 }
1545
1546 dev_warn(dev, "Invalid value %u for drive-impedance-ohms.\n", dr_ohm);
1547 return PHYCTRL_DR_50OHM;
1548 }
1549
sdhci_eic7700_delay_tuning(struct sdhci_host * host,u32 opcode)1550 static int sdhci_eic7700_delay_tuning(struct sdhci_host *host, u32 opcode)
1551 {
1552 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1553 struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
1554 int delay_min = -1;
1555 int delay_max = -1;
1556 int cmd_error = 0;
1557 int delay = 0;
1558 int i = 0;
1559 int ret;
1560
1561 for (i = 0; i <= PHY_DELAY_CODE_MAX; i++) {
1562 sdhci_eic7700_config_phy_delay(host, i);
1563 ret = mmc_send_tuning(host->mmc, opcode, &cmd_error);
1564 if (ret) {
1565 host->ops->reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
1566 usleep_range(200, 210);
1567 if (delay_min != -1 && delay_max != -1)
1568 break;
1569 } else {
1570 if (delay_min == -1) {
1571 delay_min = i;
1572 continue;
1573 } else {
1574 delay_max = i;
1575 continue;
1576 }
1577 }
1578 }
1579 if (delay_min == -1 && delay_max == -1) {
1580 pr_err("%s: delay code tuning failed!\n", mmc_hostname(host->mmc));
1581 sdhci_eic7700_config_phy_delay(host, dwc_priv->delay_line);
1582 return ret;
1583 }
1584
1585 delay = (delay_min + delay_max) / 2;
1586 sdhci_eic7700_config_phy_delay(host, delay);
1587
1588 return 0;
1589 }
1590
sdhci_eic7700_phase_code_tuning(struct sdhci_host * host,u32 opcode)1591 static int sdhci_eic7700_phase_code_tuning(struct sdhci_host *host, u32 opcode)
1592 {
1593 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1594 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
1595 u32 emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO;
1596 int phase_code = -1;
1597 int code_range = -1;
1598 int code_min = -1;
1599 int code_max = -1;
1600 int cmd_error = 0;
1601 bool is_emmc;
1602 int ret = 0;
1603 int i = 0;
1604
1605 is_emmc = (host->mmc->caps2 & emmc_caps) == emmc_caps;
1606
1607 for (i = 0; i <= MAX_PHASE_CODE; i++) {
1608 /* Centered Phase code */
1609 sdhci_writew(host, i, priv->vendor_specific_area1 + DWCMSHC_AT_STAT);
1610 ret = mmc_send_tuning(host->mmc, opcode, &cmd_error);
1611 host->ops->reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
1612
1613 if (ret) {
1614 /* SD/SDIO specific range tracking */
1615 if (!is_emmc && code_min != -1 && code_max != -1) {
1616 if (code_max - code_min > code_range) {
1617 code_range = code_max - code_min;
1618 phase_code = (code_min + code_max) / 2;
1619 if (code_range > TUNING_RANGE_THRESHOLD)
1620 break;
1621 }
1622 code_min = -1;
1623 code_max = -1;
1624 }
1625 /* EMMC breaks after first valid range */
1626 if (is_emmc && code_min != -1 && code_max != -1)
1627 break;
1628 } else {
1629 /* Track valid phase code range */
1630 if (code_min == -1) {
1631 code_min = i;
1632 if (is_emmc)
1633 continue;
1634 }
1635 code_max = i;
1636 if (!is_emmc && i == MAX_PHASE_CODE) {
1637 if (code_max - code_min > code_range) {
1638 code_range = code_max - code_min;
1639 phase_code = (code_min + code_max) / 2;
1640 }
1641 }
1642 }
1643 }
1644
1645 /* Handle tuning failure case */
1646 if ((!is_emmc && phase_code == -1) ||
1647 (is_emmc && code_min == -1 && code_max == -1)) {
1648 pr_err("%s: phase code tuning failed!\n", mmc_hostname(host->mmc));
1649 sdhci_writew(host, 0, priv->vendor_specific_area1 + DWCMSHC_AT_STAT);
1650 return -EIO;
1651 }
1652 if (is_emmc)
1653 phase_code = (code_min + code_max) / 2;
1654
1655 sdhci_writew(host, phase_code, priv->vendor_specific_area1 + DWCMSHC_AT_STAT);
1656
1657 /* SD/SDIO specific final verification */
1658 if (!is_emmc) {
1659 ret = mmc_send_tuning(host->mmc, opcode, &cmd_error);
1660 host->ops->reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
1661 if (ret) {
1662 pr_err("%s: Final phase code 0x%x verification failed!\n",
1663 mmc_hostname(host->mmc), phase_code);
1664 return ret;
1665 }
1666 }
1667
1668 return 0;
1669 }
1670
sdhci_eic7700_executing_tuning(struct sdhci_host * host,u32 opcode)1671 static int sdhci_eic7700_executing_tuning(struct sdhci_host *host, u32 opcode)
1672 {
1673 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1674 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
1675 u32 emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO;
1676 int ret = 0;
1677 u16 ctrl;
1678 u32 val;
1679
1680 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
1681 ctrl &= ~SDHCI_CTRL_TUNED_CLK;
1682 sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
1683
1684 val = sdhci_readl(host, priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
1685 val |= AT_CTRL_SW_TUNE_EN;
1686 sdhci_writew(host, val, priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
1687
1688 sdhci_writew(host, 0, priv->vendor_specific_area1 + DWCMSHC_AT_STAT);
1689 sdhci_writew(host, 0x0, SDHCI_CMD_DATA);
1690
1691 if ((host->mmc->caps2 & emmc_caps) == emmc_caps) {
1692 ret = sdhci_eic7700_delay_tuning(host, opcode);
1693 if (ret)
1694 return ret;
1695 }
1696
1697 ret = sdhci_eic7700_phase_code_tuning(host, opcode);
1698 if (ret)
1699 return ret;
1700
1701 return 0;
1702 }
1703
sdhci_eic7700_set_uhs_signaling(struct sdhci_host * host,unsigned int timing)1704 static void sdhci_eic7700_set_uhs_signaling(struct sdhci_host *host, unsigned int timing)
1705 {
1706 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1707 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
1708 u8 status;
1709 u32 val;
1710 int ret;
1711
1712 dwcmshc_set_uhs_signaling(host, timing);
1713
1714 /* here need make dll locked when in hs400 at 200MHz */
1715 if (timing == MMC_TIMING_MMC_HS400 && host->clock == 200000000) {
1716 val = sdhci_readl(host, priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
1717 val &= ~(FIELD_PREP(AT_CTRL_POST_CHANGE_DLY_MASK, AT_CTRL_POST_CHANGE_DLY));
1718 /* 2-cycle latency */
1719 val |= FIELD_PREP(AT_CTRL_POST_CHANGE_DLY_MASK, 0x2);
1720 sdhci_writew(host, val, priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
1721
1722 sdhci_writeb(host, FIELD_PREP(PHY_DLL_CNFG1_SLVDLY_MASK, PHY_DLL_CNFG1_SLVDLY) |
1723 0x3, PHY_DLL_CNFG1_R);/* DLL wait cycle input */
1724 /* DLL jump step input */
1725 sdhci_writeb(host, 0x02, PHY_DLL_CNFG2_R);
1726 sdhci_writeb(host, FIELD_PREP(PHY_DLLDL_CNFG_SLV_INPSEL_MASK,
1727 PHY_DLLDL_CNFG_SLV_INPSEL), PHY_DLLDL_CNFG_R);
1728 /* Sets the value of DLL's offset input */
1729 sdhci_writeb(host, 0x00, PHY_DLL_OFFST_R);
1730 /*
1731 * Sets the value of DLL's olbt loadval input. Controls the Ibt
1732 * timer's timeout value at which DLL runs a revalidation cycle.
1733 */
1734 sdhci_writew(host, 0xffff, PHY_DLLBT_CNFG_R);
1735 sdhci_writeb(host, PHY_DLL_CTRL_ENABLE, PHY_DLL_CTRL_R);
1736 usleep_range(100, 110);
1737
1738 ret = read_poll_timeout(sdhci_readb, status, status & DLL_LOCK_STS, 100, 1000000,
1739 false, host, PHY_DLL_STATUS_R);
1740 if (ret) {
1741 pr_err("%s: DLL lock timeout! status: 0x%x\n",
1742 mmc_hostname(host->mmc), status);
1743 return;
1744 }
1745
1746 status = sdhci_readb(host, PHY_DLL_STATUS_R);
1747 if (status & DLL_ERROR_STS) {
1748 pr_err("%s: DLL lock failed!err_status:0x%x\n",
1749 mmc_hostname(host->mmc), status);
1750 }
1751 }
1752 }
1753
sdhci_eic7700_set_uhs_wrapper(struct sdhci_host * host,unsigned int timing)1754 static void sdhci_eic7700_set_uhs_wrapper(struct sdhci_host *host, unsigned int timing)
1755 {
1756 u32 emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO;
1757
1758 if ((host->mmc->caps2 & emmc_caps) != emmc_caps)
1759 sdhci_set_uhs_signaling(host, timing);
1760 else
1761 sdhci_eic7700_set_uhs_signaling(host, timing);
1762 }
1763
eic7700_init(struct device * dev,struct sdhci_host * host,struct dwcmshc_priv * dwc_priv)1764 static int eic7700_init(struct device *dev, struct sdhci_host *host, struct dwcmshc_priv *dwc_priv)
1765 {
1766 u32 emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO;
1767 u32 sd_caps = MMC_CAP2_NO_MMC | MMC_CAP2_NO_SDIO;
1768 unsigned int val, hsp_int_status, hsp_pwr_ctrl;
1769 static const char * const clk_ids[] = {"axi"};
1770 struct of_phandle_args args;
1771 struct eic7700_priv *priv;
1772 struct regmap *hsp_regmap;
1773 int ret;
1774
1775 priv = devm_kzalloc(dev, sizeof(struct eic7700_priv), GFP_KERNEL);
1776 if (!priv)
1777 return -ENOMEM;
1778
1779 dwc_priv->priv = priv;
1780
1781 ret = sdhci_eic7700_reset_init(dev, dwc_priv->priv);
1782 if (ret) {
1783 dev_err(dev, "failed to reset\n");
1784 return ret;
1785 }
1786
1787 ret = dwcmshc_get_enable_other_clks(mmc_dev(host->mmc), dwc_priv,
1788 ARRAY_SIZE(clk_ids), clk_ids);
1789 if (ret)
1790 return ret;
1791
1792 ret = of_parse_phandle_with_fixed_args(dev->of_node, "eswin,hsp-sp-csr", 2, 0, &args);
1793 if (ret) {
1794 dev_err(dev, "Fail to parse 'eswin,hsp-sp-csr' phandle (%d)\n", ret);
1795 return ret;
1796 }
1797
1798 hsp_regmap = syscon_node_to_regmap(args.np);
1799 if (IS_ERR(hsp_regmap)) {
1800 dev_err(dev, "Failed to get regmap for 'eswin,hsp-sp-csr'\n");
1801 of_node_put(args.np);
1802 return PTR_ERR(hsp_regmap);
1803 }
1804 hsp_int_status = args.args[0];
1805 hsp_pwr_ctrl = args.args[1];
1806 of_node_put(args.np);
1807 /*
1808 * Assert clock stability: write EIC7700_INT_CLK_STABLE to hsp_int_status.
1809 * This signals to the eMMC controller that platform clocks (card, ACLK,
1810 * BCLK, TMCLK) are enabled and stable.
1811 */
1812 regmap_write(hsp_regmap, hsp_int_status, EIC7700_INT_CLK_STABLE);
1813 /*
1814 * Assert voltage stability: write EIC7700_HOST_VAL_STABLE to hsp_pwr_ctrl.
1815 * This signals that VDD is stable and permits transition to high-speed
1816 * modes (e.g., UHS-I).
1817 */
1818 regmap_write(hsp_regmap, hsp_pwr_ctrl, EIC7700_HOST_VAL_STABLE);
1819
1820 if ((host->mmc->caps2 & emmc_caps) == emmc_caps)
1821 dwc_priv->delay_line = PHY_DELAY_CODE_EMMC;
1822 else if ((host->mmc->caps2 & sd_caps) == sd_caps)
1823 dwc_priv->delay_line = PHY_DELAY_CODE_SD;
1824 else
1825 dwc_priv->delay_line = PHY_DELAY_CODE_SDIO;
1826
1827 if (!of_property_read_u32(dev->of_node, "eswin,drive-impedance-ohms", &val))
1828 priv->drive_impedance = eic7700_convert_drive_impedance_ohm(dev, val);
1829 return 0;
1830 }
1831
dwcmshc_k230_sdhci_set_clock(struct sdhci_host * host,unsigned int clock)1832 static void dwcmshc_k230_sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
1833 {
1834 u16 clk;
1835
1836 sdhci_set_clock(host, clock);
1837
1838 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
1839 /*
1840 * It is necessary to enable SDHCI_PROG_CLOCK_MODE. This is a
1841 * vendor-specific quirk. If this is not done, the eMMC will be
1842 * unable to read or write.
1843 */
1844 clk |= SDHCI_PROG_CLOCK_MODE;
1845 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
1846 }
1847
sdhci_k230_config_phy_delay(struct sdhci_host * host)1848 static void sdhci_k230_config_phy_delay(struct sdhci_host *host)
1849 {
1850 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1851 struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
1852 u32 val;
1853
1854 sdhci_writeb(host, PHY_COMMDL_CNFG_DLSTEP_SEL, PHY_COMMDL_CNFG);
1855 sdhci_writeb(host, 0x0, PHY_SDCLKDL_CNFG_R);
1856 sdhci_writeb(host, PHY_SDCLKDL_DC_INITIAL, PHY_SDCLKDL_DC_R);
1857
1858 val = PHY_SMPLDL_CNFG_EXTDLY_EN;
1859 val |= FIELD_PREP(PHY_SMPLDL_CNFG_INPSEL_MASK, PHY_SMPLDL_CNFG_INPSEL);
1860 sdhci_writeb(host, val, PHY_SMPLDL_CNFG_R);
1861
1862 sdhci_writeb(host, FIELD_PREP(PHY_ATDL_CNFG_INPSEL_MASK, PHY_ATDL_CNFG_INPSEL),
1863 PHY_ATDL_CNFG_R);
1864
1865 val = sdhci_readl(host, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
1866 val |= AT_CTRL_TUNE_CLK_STOP_EN;
1867 val |= FIELD_PREP(AT_CTRL_PRE_CHANGE_DLY_MASK, AT_CTRL_PRE_CHANGE_DLY);
1868 val |= FIELD_PREP(AT_CTRL_POST_CHANGE_DLY_MASK, AT_CTRL_POST_CHANGE_DLY);
1869 sdhci_writel(host, val, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);
1870 sdhci_writel(host, 0x0, dwc_priv->vendor_specific_area1 + DWCMSHC_AT_STAT);
1871 }
1872
dwcmshc_k230_phy_init(struct sdhci_host * host)1873 static int dwcmshc_k230_phy_init(struct sdhci_host *host)
1874 {
1875 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1876 struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
1877 u32 rxsel;
1878 u32 val;
1879 u32 reg;
1880 int ret;
1881
1882 /* reset phy */
1883 sdhci_writew(host, 0, PHY_CNFG_R);
1884
1885 /* Disable the clock */
1886 sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
1887
1888 rxsel = dwc_priv->flags & FLAG_IO_FIXED_1V8 ? PHY_PAD_RXSEL_1V8 : PHY_PAD_RXSEL_3V3;
1889
1890 val = rxsel;
1891 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P_k230);
1892 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N_k230);
1893 val |= FIELD_PREP(PHY_PAD_WEAKPULL_MASK, PHY_PAD_WEAKPULL_PULLUP);
1894
1895 sdhci_writew(host, val, PHY_CMDPAD_CNFG_R);
1896 sdhci_writew(host, val, PHY_DATAPAD_CNFG_R);
1897 sdhci_writew(host, val, PHY_RSTNPAD_CNFG_R);
1898
1899 val = rxsel;
1900 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P_k230);
1901 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N_k230);
1902 sdhci_writew(host, val, PHY_CLKPAD_CNFG_R);
1903
1904 val = rxsel;
1905 val |= FIELD_PREP(PHY_PAD_WEAKPULL_MASK, PHY_PAD_WEAKPULL_PULLDOWN);
1906 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P_k230);
1907 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N_k230);
1908 sdhci_writew(host, val, PHY_STBPAD_CNFG_R);
1909
1910 sdhci_k230_config_phy_delay(host);
1911
1912 /* Wait max 150 ms */
1913 ret = read_poll_timeout(sdhci_readl, reg,
1914 (reg & FIELD_PREP(PHY_CNFG_PHY_PWRGOOD_MASK, 1)),
1915 10, 150000, false, host, PHY_CNFG_R);
1916 if (ret) {
1917 dev_err(mmc_dev(host->mmc), "READ PHY PWRGOOD timeout!\n");
1918 return -ETIMEDOUT;
1919 }
1920
1921 reg = FIELD_PREP(PHY_CNFG_PAD_SN_MASK, PHY_CNFG_PAD_SN_k230) |
1922 FIELD_PREP(PHY_CNFG_PAD_SP_MASK, PHY_CNFG_PAD_SP_k230);
1923 sdhci_writel(host, reg, PHY_CNFG_R);
1924
1925 /* de-assert the phy */
1926 reg |= PHY_CNFG_RSTN_DEASSERT;
1927 sdhci_writel(host, reg, PHY_CNFG_R);
1928
1929 return 0;
1930 }
1931
dwcmshc_k230_sdhci_reset(struct sdhci_host * host,u8 mask)1932 static void dwcmshc_k230_sdhci_reset(struct sdhci_host *host, u8 mask)
1933 {
1934 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1935 struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
1936 const struct k230_pltfm_data *k230_pdata = to_pltfm_data(dwc_priv, k230);
1937 u8 emmc_ctrl;
1938
1939 dwcmshc_reset(host, mask);
1940
1941 if (mask != SDHCI_RESET_ALL)
1942 return;
1943
1944 emmc_ctrl = sdhci_readw(host, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL);
1945 sdhci_writeb(host, emmc_ctrl, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL);
1946
1947 if (k230_pdata->is_emmc)
1948 dwcmshc_k230_phy_init(host);
1949 else
1950 sdhci_writel(host, 0x0, dwc_priv->vendor_specific_area1 + DWCMSHC_HOST_CTRL3);
1951 }
1952
dwcmshc_k230_init(struct device * dev,struct sdhci_host * host,struct dwcmshc_priv * dwc_priv)1953 static int dwcmshc_k230_init(struct device *dev, struct sdhci_host *host,
1954 struct dwcmshc_priv *dwc_priv)
1955 {
1956 const struct k230_pltfm_data *k230_pdata = to_pltfm_data(dwc_priv, k230);
1957 static const char * const clk_ids[] = {"block", "timer", "axi"};
1958 struct device_node *usb_phy_node;
1959 struct k230_priv *k230_priv;
1960 u32 data;
1961 int ret;
1962
1963 k230_priv = devm_kzalloc(dev, sizeof(struct k230_priv), GFP_KERNEL);
1964 if (!k230_priv)
1965 return -ENOMEM;
1966
1967 dwc_priv->priv = k230_priv;
1968
1969 usb_phy_node = of_parse_phandle(dev->of_node, "canaan,usb-phy", 0);
1970 if (!usb_phy_node)
1971 return dev_err_probe(dev, -ENODEV, "Failed to find canaan,usb-phy phandle\n");
1972
1973 k230_priv->hi_sys_regmap = device_node_to_regmap(usb_phy_node);
1974 of_node_put(usb_phy_node);
1975
1976 if (IS_ERR(k230_priv->hi_sys_regmap))
1977 return dev_err_probe(dev, PTR_ERR(k230_priv->hi_sys_regmap),
1978 "Failed to get k230-usb-phy regmap\n");
1979
1980 ret = dwcmshc_get_enable_other_clks(mmc_dev(host->mmc), dwc_priv,
1981 ARRAY_SIZE(clk_ids), clk_ids);
1982 if (ret)
1983 return dev_err_probe(dev, ret, "Failed to get/enable k230 mmc other clocks\n");
1984
1985 if (k230_pdata->is_emmc) {
1986 host->flags &= ~SDHCI_SIGNALING_330;
1987 dwc_priv->flags |= FLAG_IO_FIXED_1V8;
1988 } else {
1989 host->mmc->caps |= MMC_CAP_SD_HIGHSPEED;
1990 host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
1991 }
1992
1993 ret = regmap_read(k230_priv->hi_sys_regmap, k230_pdata->ctrl_reg, &data);
1994 if (ret)
1995 return dev_err_probe(dev, ret, "Failed to read control reg 0x%x\n",
1996 k230_pdata->ctrl_reg);
1997
1998 data |= k230_pdata->write_prot_bit | k230_pdata->vol_stable_bit;
1999 ret = regmap_write(k230_priv->hi_sys_regmap, k230_pdata->ctrl_reg, data);
2000 if (ret)
2001 return dev_err_probe(dev, ret, "Failed to write control reg 0x%x\n",
2002 k230_pdata->ctrl_reg);
2003
2004 return 0;
2005 }
2006
2007 static const struct sdhci_ops sdhci_dwcmshc_ops = {
2008 .set_clock = sdhci_set_clock,
2009 .set_bus_width = sdhci_set_bus_width,
2010 .set_uhs_signaling = dwcmshc_set_uhs_signaling,
2011 .get_max_clock = dwcmshc_get_max_clock,
2012 .reset = dwcmshc_reset,
2013 .adma_write_desc = dwcmshc_adma_write_desc,
2014 .irq = dwcmshc_cqe_irq_handler,
2015 };
2016
2017 #ifdef CONFIG_ACPI
dwcmshc_bf3_hw_reset(struct sdhci_host * host)2018 static void dwcmshc_bf3_hw_reset(struct sdhci_host *host)
2019 {
2020 struct arm_smccc_res res = { 0 };
2021
2022 arm_smccc_smc(BLUEFIELD_SMC_SET_EMMC_RST_N, 0, 0, 0, 0, 0, 0, 0, &res);
2023
2024 if (res.a0)
2025 pr_err("%s: RST_N failed.\n", mmc_hostname(host->mmc));
2026 }
2027
2028 static const struct sdhci_ops sdhci_dwcmshc_bf3_ops = {
2029 .set_clock = sdhci_set_clock,
2030 .set_bus_width = sdhci_set_bus_width,
2031 .set_uhs_signaling = dwcmshc_set_uhs_signaling,
2032 .get_max_clock = dwcmshc_get_max_clock,
2033 .reset = sdhci_reset,
2034 .adma_write_desc = dwcmshc_adma_write_desc,
2035 .irq = dwcmshc_cqe_irq_handler,
2036 .hw_reset = dwcmshc_bf3_hw_reset,
2037 };
2038 #endif
2039
2040 static const struct sdhci_ops sdhci_dwcmshc_rk35xx_ops = {
2041 .set_clock = dwcmshc_rk3568_set_clock,
2042 .set_bus_width = sdhci_set_bus_width,
2043 .set_uhs_signaling = dwcmshc_set_uhs_signaling,
2044 .get_max_clock = rk35xx_get_max_clock,
2045 .reset = rk35xx_sdhci_reset,
2046 .adma_write_desc = dwcmshc_adma_write_desc,
2047 .irq = dwcmshc_cqe_irq_handler,
2048 };
2049
2050 static const struct sdhci_ops sdhci_dwcmshc_th1520_ops = {
2051 .set_clock = sdhci_set_clock,
2052 .set_bus_width = sdhci_set_bus_width,
2053 .set_uhs_signaling = th1520_set_uhs_signaling,
2054 .get_max_clock = dwcmshc_get_max_clock,
2055 .reset = th1520_sdhci_reset,
2056 .adma_write_desc = dwcmshc_adma_write_desc,
2057 .voltage_switch = dwcmshc_phy_init,
2058 .platform_execute_tuning = th1520_execute_tuning,
2059 };
2060
2061 static const struct sdhci_ops sdhci_dwcmshc_cv18xx_ops = {
2062 .set_clock = sdhci_set_clock,
2063 .set_bus_width = sdhci_set_bus_width,
2064 .set_uhs_signaling = dwcmshc_set_uhs_signaling,
2065 .get_max_clock = dwcmshc_get_max_clock,
2066 .reset = cv18xx_sdhci_reset,
2067 .adma_write_desc = dwcmshc_adma_write_desc,
2068 .platform_execute_tuning = cv18xx_sdhci_execute_tuning,
2069 };
2070
2071 static const struct sdhci_ops sdhci_dwcmshc_sg2042_ops = {
2072 .set_clock = sdhci_set_clock,
2073 .set_bus_width = sdhci_set_bus_width,
2074 .set_uhs_signaling = dwcmshc_set_uhs_signaling,
2075 .get_max_clock = dwcmshc_get_max_clock,
2076 .reset = sg2042_sdhci_reset,
2077 .adma_write_desc = dwcmshc_adma_write_desc,
2078 .platform_execute_tuning = th1520_execute_tuning,
2079 };
2080
2081 static const struct sdhci_ops sdhci_dwcmshc_eic7700_ops = {
2082 .set_clock = sdhci_eic7700_set_clock,
2083 .get_max_clock = sdhci_pltfm_clk_get_max_clock,
2084 .get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
2085 .set_bus_width = sdhci_set_bus_width,
2086 .reset = sdhci_eic7700_reset,
2087 .set_uhs_signaling = sdhci_eic7700_set_uhs_wrapper,
2088 .set_power = sdhci_set_power_and_bus_voltage,
2089 .irq = dwcmshc_cqe_irq_handler,
2090 .adma_write_desc = dwcmshc_adma_write_desc,
2091 .platform_execute_tuning = sdhci_eic7700_executing_tuning,
2092 };
2093
2094 static const struct sdhci_ops sdhci_dwcmshc_k230_ops = {
2095 .set_clock = dwcmshc_k230_sdhci_set_clock,
2096 .set_bus_width = sdhci_set_bus_width,
2097 .set_uhs_signaling = dwcmshc_set_uhs_signaling,
2098 .get_max_clock = sdhci_pltfm_clk_get_max_clock,
2099 .reset = dwcmshc_k230_sdhci_reset,
2100 .adma_write_desc = dwcmshc_adma_write_desc,
2101 };
2102
2103 static const struct dwcmshc_pltfm_data sdhci_dwcmshc_pdata = {
2104 .pdata = {
2105 .ops = &sdhci_dwcmshc_ops,
2106 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
2107 .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
2108 },
2109 };
2110
2111 #ifdef CONFIG_ACPI
2112 static const struct dwcmshc_pltfm_data sdhci_dwcmshc_bf3_pdata = {
2113 .pdata = {
2114 .ops = &sdhci_dwcmshc_bf3_ops,
2115 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
2116 .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
2117 SDHCI_QUIRK2_ACMD23_BROKEN,
2118 },
2119 };
2120 #endif
2121
2122 static const struct cqhci_host_ops rk35xx_cqhci_ops = {
2123 .pre_enable = rk35xx_sdhci_cqe_pre_enable,
2124 .enable = rk35xx_sdhci_cqe_enable,
2125 .disable = rk35xx_sdhci_cqe_disable,
2126 .post_disable = rk35xx_sdhci_cqe_post_disable,
2127 .dumpregs = dwcmshc_cqhci_dumpregs,
2128 .set_tran_desc = dwcmshc_set_tran_desc,
2129 };
2130
2131 static const struct rockchip_pltfm_data sdhci_dwcmshc_rk3568_pdata = {
2132 .dwcmshc_pdata = {
2133 .pdata = {
2134 .ops = &sdhci_dwcmshc_rk35xx_ops,
2135 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
2136 SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
2137 .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
2138 SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN,
2139 },
2140 .cqhci_host_ops = &rk35xx_cqhci_ops,
2141 .init = dwcmshc_rk35xx_init,
2142 .postinit = dwcmshc_rk35xx_postinit,
2143 },
2144 .revision = 0,
2145 };
2146
2147 static const struct rockchip_pltfm_data sdhci_dwcmshc_rk3576_pdata = {
2148 .dwcmshc_pdata = {
2149 .pdata = {
2150 .ops = &sdhci_dwcmshc_rk35xx_ops,
2151 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
2152 SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
2153 .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
2154 SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN,
2155 },
2156 .cqhci_host_ops = &rk35xx_cqhci_ops,
2157 .init = dwcmshc_rk35xx_init,
2158 .postinit = dwcmshc_rk3576_postinit,
2159 },
2160 .revision = 1,
2161 };
2162
2163 static const struct rockchip_pltfm_data sdhci_dwcmshc_rk3588_pdata = {
2164 .dwcmshc_pdata = {
2165 .pdata = {
2166 .ops = &sdhci_dwcmshc_rk35xx_ops,
2167 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
2168 SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
2169 .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
2170 SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN,
2171 },
2172 .cqhci_host_ops = &rk35xx_cqhci_ops,
2173 .init = dwcmshc_rk35xx_init,
2174 .postinit = dwcmshc_rk35xx_postinit,
2175 },
2176 .revision = 1,
2177 };
2178
2179 static const struct dwcmshc_pltfm_data sdhci_dwcmshc_th1520_pdata = {
2180 .pdata = {
2181 .ops = &sdhci_dwcmshc_th1520_ops,
2182 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
2183 .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
2184 },
2185 .init = th1520_init,
2186 };
2187
2188 static const struct dwcmshc_pltfm_data sdhci_dwcmshc_cv18xx_pdata = {
2189 .pdata = {
2190 .ops = &sdhci_dwcmshc_cv18xx_ops,
2191 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
2192 .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
2193 },
2194 };
2195
2196 static const struct dwcmshc_pltfm_data sdhci_dwcmshc_sg2042_pdata = {
2197 .pdata = {
2198 .ops = &sdhci_dwcmshc_sg2042_ops,
2199 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
2200 .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
2201 },
2202 .init = sg2042_init,
2203 };
2204
2205 static const struct dwcmshc_pltfm_data sdhci_dwcmshc_eic7700_pdata = {
2206 .pdata = {
2207 .ops = &sdhci_dwcmshc_eic7700_ops,
2208 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
2209 SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
2210 .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
2211 SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN,
2212 },
2213 .init = eic7700_init,
2214 };
2215
2216 static const struct k230_pltfm_data k230_emmc_data = {
2217 .dwcmshc_pdata = {
2218 .pdata = {
2219 .ops = &sdhci_dwcmshc_k230_ops,
2220 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
2221 SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
2222 },
2223 .init = dwcmshc_k230_init,
2224 },
2225 .is_emmc = true,
2226 .ctrl_reg = SD0_CTRL,
2227 .vol_stable_bit = SD0_HOST_REG_VOL_STABLE,
2228 .write_prot_bit = SD0_CARD_WRITE_PROT,
2229 };
2230
2231 static const struct k230_pltfm_data k230_sdio_data = {
2232 .dwcmshc_pdata = {
2233 .pdata = {
2234 .ops = &sdhci_dwcmshc_k230_ops,
2235 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
2236 SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
2237 },
2238 .init = dwcmshc_k230_init,
2239 },
2240 .is_emmc = false,
2241 .ctrl_reg = SD1_CTRL,
2242 .vol_stable_bit = SD1_HOST_REG_VOL_STABLE,
2243 .write_prot_bit = SD1_CARD_WRITE_PROT,
2244 };
2245
2246 static const struct sdhci_ops sdhci_dwcmshc_hpe_ops = {
2247 .set_clock = dwcmshc_hpe_set_clock,
2248 .set_bus_width = sdhci_set_bus_width,
2249 .set_uhs_signaling = dwcmshc_hpe_set_uhs_signaling,
2250 .get_max_clock = dwcmshc_get_max_clock,
2251 .reset = dwcmshc_hpe_reset,
2252 .adma_write_desc = dwcmshc_adma_write_desc,
2253 .irq = dwcmshc_cqe_irq_handler,
2254 };
2255
2256 static const struct dwcmshc_pltfm_data sdhci_dwcmshc_hpe_gsc_pdata = {
2257 .pdata = {
2258 .ops = &sdhci_dwcmshc_hpe_ops,
2259 .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
2260 .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
2261 },
2262 .init = dwcmshc_hpe_gsc_init,
2263 };
2264
2265 static const struct cqhci_host_ops dwcmshc_cqhci_ops = {
2266 .enable = dwcmshc_sdhci_cqe_enable,
2267 .disable = sdhci_cqe_disable,
2268 .dumpregs = dwcmshc_cqhci_dumpregs,
2269 .set_tran_desc = dwcmshc_set_tran_desc,
2270 };
2271
dwcmshc_cqhci_init(struct sdhci_host * host,struct platform_device * pdev,const struct dwcmshc_pltfm_data * pltfm_data)2272 static void dwcmshc_cqhci_init(struct sdhci_host *host, struct platform_device *pdev,
2273 const struct dwcmshc_pltfm_data *pltfm_data)
2274 {
2275 struct cqhci_host *cq_host;
2276 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
2277 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
2278 bool dma64 = false;
2279 u16 clk;
2280 int err;
2281
2282 host->mmc->caps2 |= MMC_CAP2_CQE | MMC_CAP2_CQE_DCMD;
2283 cq_host = devm_kzalloc(&pdev->dev, sizeof(*cq_host), GFP_KERNEL);
2284 if (!cq_host) {
2285 dev_err(mmc_dev(host->mmc), "Unable to setup CQE: not enough memory\n");
2286 goto dsbl_cqe_caps;
2287 }
2288
2289 /*
2290 * For dwcmshc host controller we have to enable internal clock
2291 * before access to some registers from Vendor Specific Area 2.
2292 */
2293 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
2294 clk |= SDHCI_CLOCK_INT_EN;
2295 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
2296 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
2297 if (!(clk & SDHCI_CLOCK_INT_EN)) {
2298 dev_err(mmc_dev(host->mmc), "Unable to setup CQE: internal clock enable error\n");
2299 goto free_cq_host;
2300 }
2301
2302 cq_host->mmio = host->ioaddr + priv->vendor_specific_area2;
2303 if (pltfm_data->cqhci_host_ops)
2304 cq_host->ops = pltfm_data->cqhci_host_ops;
2305 else
2306 cq_host->ops = &dwcmshc_cqhci_ops;
2307
2308 /* Enable using of 128-bit task descriptors */
2309 dma64 = host->flags & SDHCI_USE_64_BIT_DMA;
2310 if (dma64) {
2311 dev_dbg(mmc_dev(host->mmc), "128-bit task descriptors\n");
2312 cq_host->caps |= CQHCI_TASK_DESC_SZ_128;
2313 }
2314 err = cqhci_init(cq_host, host->mmc, dma64);
2315 if (err) {
2316 dev_err(mmc_dev(host->mmc), "Unable to setup CQE: error %d\n", err);
2317 goto int_clock_disable;
2318 }
2319
2320 dev_dbg(mmc_dev(host->mmc), "CQE init done\n");
2321
2322 return;
2323
2324 int_clock_disable:
2325 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
2326 clk &= ~SDHCI_CLOCK_INT_EN;
2327 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
2328
2329 free_cq_host:
2330 devm_kfree(&pdev->dev, cq_host);
2331
2332 dsbl_cqe_caps:
2333 host->mmc->caps2 &= ~(MMC_CAP2_CQE | MMC_CAP2_CQE_DCMD);
2334 }
2335
2336 static const struct of_device_id sdhci_dwcmshc_dt_ids[] = {
2337 {
2338 .compatible = "canaan,k230-emmc",
2339 .data = &k230_emmc_data.dwcmshc_pdata,
2340 },
2341 {
2342 .compatible = "canaan,k230-sdio",
2343 .data = &k230_sdio_data.dwcmshc_pdata,
2344 },
2345 {
2346 .compatible = "rockchip,rk3588-dwcmshc",
2347 .data = &sdhci_dwcmshc_rk3588_pdata,
2348 },
2349 {
2350 .compatible = "rockchip,rk3576-dwcmshc",
2351 .data = &sdhci_dwcmshc_rk3576_pdata,
2352 },
2353 {
2354 .compatible = "rockchip,rk3568-dwcmshc",
2355 .data = &sdhci_dwcmshc_rk3568_pdata,
2356 },
2357 {
2358 .compatible = "snps,dwcmshc-sdhci",
2359 .data = &sdhci_dwcmshc_pdata,
2360 },
2361 {
2362 .compatible = "sophgo,cv1800b-dwcmshc",
2363 .data = &sdhci_dwcmshc_cv18xx_pdata,
2364 },
2365 {
2366 .compatible = "sophgo,sg2002-dwcmshc",
2367 .data = &sdhci_dwcmshc_cv18xx_pdata,
2368 },
2369 {
2370 .compatible = "thead,th1520-dwcmshc",
2371 .data = &sdhci_dwcmshc_th1520_pdata,
2372 },
2373 {
2374 .compatible = "sophgo,sg2042-dwcmshc",
2375 .data = &sdhci_dwcmshc_sg2042_pdata,
2376 },
2377 {
2378 .compatible = "eswin,eic7700-dwcmshc",
2379 .data = &sdhci_dwcmshc_eic7700_pdata,
2380 },
2381 {
2382 .compatible = "hpe,gsc-dwcmshc",
2383 .data = &sdhci_dwcmshc_hpe_gsc_pdata,
2384 },
2385 {},
2386 };
2387 MODULE_DEVICE_TABLE(of, sdhci_dwcmshc_dt_ids);
2388
2389 #ifdef CONFIG_ACPI
2390 static const struct acpi_device_id sdhci_dwcmshc_acpi_ids[] = {
2391 {
2392 .id = "MLNXBF30",
2393 .driver_data = (kernel_ulong_t)&sdhci_dwcmshc_bf3_pdata,
2394 },
2395 {}
2396 };
2397 MODULE_DEVICE_TABLE(acpi, sdhci_dwcmshc_acpi_ids);
2398 #endif
2399
dwcmshc_probe(struct platform_device * pdev)2400 static int dwcmshc_probe(struct platform_device *pdev)
2401 {
2402 struct device *dev = &pdev->dev;
2403 struct sdhci_pltfm_host *pltfm_host;
2404 struct sdhci_host *host;
2405 struct dwcmshc_priv *priv;
2406 const struct dwcmshc_pltfm_data *pltfm_data;
2407 int err;
2408 u32 extra, caps;
2409
2410 pltfm_data = device_get_match_data(&pdev->dev);
2411 if (!pltfm_data) {
2412 dev_err(&pdev->dev, "Error: No device match data found\n");
2413 return -ENODEV;
2414 }
2415
2416 host = sdhci_pltfm_init(pdev, &pltfm_data->pdata,
2417 sizeof(struct dwcmshc_priv));
2418 if (IS_ERR(host))
2419 return PTR_ERR(host);
2420
2421 /*
2422 * extra adma table cnt for cross 128M boundary handling.
2423 */
2424 extra = DIV_ROUND_UP_ULL(dma_get_required_mask(dev), SZ_128M);
2425 if (extra > SDHCI_MAX_SEGS)
2426 extra = SDHCI_MAX_SEGS;
2427 host->adma_table_cnt += extra;
2428
2429 pltfm_host = sdhci_priv(host);
2430 priv = sdhci_pltfm_priv(pltfm_host);
2431 priv->dwcmshc_pdata = pltfm_data;
2432
2433 if (dev->of_node) {
2434 pltfm_host->clk = devm_clk_get(dev, "core");
2435 if (IS_ERR(pltfm_host->clk))
2436 return dev_err_probe(dev, PTR_ERR(pltfm_host->clk),
2437 "failed to get core clk\n");
2438
2439 err = clk_prepare_enable(pltfm_host->clk);
2440 if (err)
2441 return err;
2442
2443 priv->bus_clk = devm_clk_get(dev, "bus");
2444 if (!IS_ERR(priv->bus_clk))
2445 clk_prepare_enable(priv->bus_clk);
2446 }
2447
2448 err = mmc_of_parse(host->mmc);
2449 if (err)
2450 goto err_clk;
2451
2452 sdhci_get_of_property(pdev);
2453
2454 priv->vendor_specific_area1 =
2455 sdhci_readl(host, DWCMSHC_P_VENDOR_AREA1) & DWCMSHC_AREA1_MASK;
2456
2457 host->mmc_host_ops.request = dwcmshc_request;
2458 host->mmc_host_ops.hs400_enhanced_strobe = dwcmshc_hs400_enhanced_strobe;
2459 host->mmc_host_ops.execute_tuning = dwcmshc_execute_tuning;
2460
2461 if (pltfm_data->init) {
2462 err = pltfm_data->init(&pdev->dev, host, priv);
2463 if (err)
2464 goto err_clk;
2465 }
2466
2467 #ifdef CONFIG_ACPI
2468 if (pltfm_data == &sdhci_dwcmshc_bf3_pdata)
2469 sdhci_enable_v4_mode(host);
2470 #endif
2471
2472 caps = sdhci_readl(host, SDHCI_CAPABILITIES);
2473 if (caps & SDHCI_CAN_64BIT_V4)
2474 sdhci_enable_v4_mode(host);
2475
2476 host->mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY;
2477
2478 pm_runtime_get_noresume(dev);
2479 pm_runtime_set_active(dev);
2480 pm_runtime_enable(dev);
2481
2482 err = sdhci_setup_host(host);
2483 if (err)
2484 goto err_rpm;
2485
2486 /* Setup Command Queue Engine if enabled */
2487 if (device_property_read_bool(&pdev->dev, "supports-cqe")) {
2488 priv->vendor_specific_area2 =
2489 sdhci_readw(host, DWCMSHC_P_VENDOR_AREA2);
2490
2491 dwcmshc_cqhci_init(host, pdev, pltfm_data);
2492 }
2493
2494 if (pltfm_data->postinit)
2495 pltfm_data->postinit(host, priv);
2496
2497 err = __sdhci_add_host(host);
2498 if (err)
2499 goto err_setup_host;
2500
2501 pm_runtime_put(dev);
2502
2503 return 0;
2504
2505 err_setup_host:
2506 sdhci_cleanup_host(host);
2507 err_rpm:
2508 pm_runtime_disable(dev);
2509 pm_runtime_put_noidle(dev);
2510 err_clk:
2511 clk_disable_unprepare(pltfm_host->clk);
2512 clk_disable_unprepare(priv->bus_clk);
2513 clk_bulk_disable_unprepare(priv->num_other_clks, priv->other_clks);
2514 return err;
2515 }
2516
dwcmshc_disable_card_clk(struct sdhci_host * host)2517 static void dwcmshc_disable_card_clk(struct sdhci_host *host)
2518 {
2519 u16 ctrl;
2520
2521 ctrl = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
2522 if (ctrl & SDHCI_CLOCK_CARD_EN) {
2523 ctrl &= ~SDHCI_CLOCK_CARD_EN;
2524 sdhci_writew(host, ctrl, SDHCI_CLOCK_CONTROL);
2525 }
2526 }
2527
dwcmshc_remove(struct platform_device * pdev)2528 static void dwcmshc_remove(struct platform_device *pdev)
2529 {
2530 struct sdhci_host *host = platform_get_drvdata(pdev);
2531 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
2532 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
2533
2534 pm_runtime_get_sync(&pdev->dev);
2535 pm_runtime_disable(&pdev->dev);
2536 pm_runtime_put_noidle(&pdev->dev);
2537
2538 sdhci_remove_host(host, 0);
2539
2540 dwcmshc_disable_card_clk(host);
2541
2542 clk_disable_unprepare(pltfm_host->clk);
2543 clk_disable_unprepare(priv->bus_clk);
2544 clk_bulk_disable_unprepare(priv->num_other_clks, priv->other_clks);
2545 }
2546
dwcmshc_suspend(struct device * dev)2547 static int dwcmshc_suspend(struct device *dev)
2548 {
2549 struct sdhci_host *host = dev_get_drvdata(dev);
2550 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
2551 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
2552 int ret;
2553
2554 pm_runtime_resume(dev);
2555
2556 if (host->mmc->caps2 & MMC_CAP2_CQE) {
2557 ret = cqhci_suspend(host->mmc);
2558 if (ret)
2559 return ret;
2560 }
2561
2562 ret = sdhci_suspend_host(host);
2563 if (ret)
2564 return ret;
2565
2566 clk_disable_unprepare(pltfm_host->clk);
2567 if (!IS_ERR(priv->bus_clk))
2568 clk_disable_unprepare(priv->bus_clk);
2569
2570 clk_bulk_disable_unprepare(priv->num_other_clks, priv->other_clks);
2571
2572 return ret;
2573 }
2574
dwcmshc_resume(struct device * dev)2575 static int dwcmshc_resume(struct device *dev)
2576 {
2577 struct sdhci_host *host = dev_get_drvdata(dev);
2578 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
2579 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
2580 int ret;
2581
2582 ret = clk_prepare_enable(pltfm_host->clk);
2583 if (ret)
2584 return ret;
2585
2586 if (!IS_ERR(priv->bus_clk)) {
2587 ret = clk_prepare_enable(priv->bus_clk);
2588 if (ret)
2589 goto disable_clk;
2590 }
2591
2592 ret = clk_bulk_prepare_enable(priv->num_other_clks, priv->other_clks);
2593 if (ret)
2594 goto disable_bus_clk;
2595
2596 ret = sdhci_resume_host(host);
2597 if (ret)
2598 goto disable_other_clks;
2599
2600 if (host->mmc->caps2 & MMC_CAP2_CQE) {
2601 ret = cqhci_resume(host->mmc);
2602 if (ret)
2603 goto disable_other_clks;
2604 }
2605
2606 return 0;
2607
2608 disable_other_clks:
2609 clk_bulk_disable_unprepare(priv->num_other_clks, priv->other_clks);
2610 disable_bus_clk:
2611 if (!IS_ERR(priv->bus_clk))
2612 clk_disable_unprepare(priv->bus_clk);
2613 disable_clk:
2614 clk_disable_unprepare(pltfm_host->clk);
2615 return ret;
2616 }
2617
dwcmshc_runtime_suspend(struct device * dev)2618 static int dwcmshc_runtime_suspend(struct device *dev)
2619 {
2620 struct sdhci_host *host = dev_get_drvdata(dev);
2621
2622 dwcmshc_disable_card_clk(host);
2623
2624 return 0;
2625 }
2626
dwcmshc_runtime_resume(struct device * dev)2627 static int dwcmshc_runtime_resume(struct device *dev)
2628 {
2629 struct sdhci_host *host = dev_get_drvdata(dev);
2630
2631 dwcmshc_enable_card_clk(host);
2632
2633 return 0;
2634 }
2635
2636 static const struct dev_pm_ops dwcmshc_pmops = {
2637 SYSTEM_SLEEP_PM_OPS(dwcmshc_suspend, dwcmshc_resume)
2638 RUNTIME_PM_OPS(dwcmshc_runtime_suspend, dwcmshc_runtime_resume, NULL)
2639 };
2640
2641 static struct platform_driver sdhci_dwcmshc_driver = {
2642 .driver = {
2643 .name = "sdhci-dwcmshc",
2644 .probe_type = PROBE_PREFER_ASYNCHRONOUS,
2645 .of_match_table = sdhci_dwcmshc_dt_ids,
2646 .acpi_match_table = ACPI_PTR(sdhci_dwcmshc_acpi_ids),
2647 .pm = pm_ptr(&dwcmshc_pmops),
2648 },
2649 .probe = dwcmshc_probe,
2650 .remove = dwcmshc_remove,
2651 };
2652 module_platform_driver(sdhci_dwcmshc_driver);
2653
2654 MODULE_DESCRIPTION("SDHCI platform driver for Synopsys DWC MSHC");
2655 MODULE_AUTHOR("Jisheng Zhang <jszhang@kernel.org>");
2656 MODULE_LICENSE("GPL v2");
2657