1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2010 Google, Inc.
6 #include <linux/delay.h>
7 #include <linux/dma-mapping.h>
9 #include <linux/module.h>
10 #include <linux/init.h>
11 #include <linux/iopoll.h>
12 #include <linux/platform_device.h>
13 #include <linux/clk.h>
16 #include <linux/of_device.h>
17 #include <linux/pinctrl/consumer.h>
18 #include <linux/regulator/consumer.h>
19 #include <linux/reset.h>
20 #include <linux/mmc/card.h>
21 #include <linux/mmc/host.h>
22 #include <linux/mmc/mmc.h>
23 #include <linux/mmc/slot-gpio.h>
24 #include <linux/gpio/consumer.h>
25 #include <linux/ktime.h>
27 #include "sdhci-pltfm.h"
30 /* Tegra SDHOST controller vendor register definitions */
31 #define SDHCI_TEGRA_VENDOR_CLOCK_CTRL 0x100
32 #define SDHCI_CLOCK_CTRL_TAP_MASK 0x00ff0000
33 #define SDHCI_CLOCK_CTRL_TAP_SHIFT 16
34 #define SDHCI_CLOCK_CTRL_TRIM_MASK 0x1f000000
35 #define SDHCI_CLOCK_CTRL_TRIM_SHIFT 24
36 #define SDHCI_CLOCK_CTRL_SDR50_TUNING_OVERRIDE BIT(5)
37 #define SDHCI_CLOCK_CTRL_PADPIPE_CLKEN_OVERRIDE BIT(3)
38 #define SDHCI_CLOCK_CTRL_SPI_MODE_CLKEN_OVERRIDE BIT(2)
40 #define SDHCI_TEGRA_VENDOR_SYS_SW_CTRL 0x104
41 #define SDHCI_TEGRA_SYS_SW_CTRL_ENHANCED_STROBE BIT(31)
43 #define SDHCI_TEGRA_VENDOR_CAP_OVERRIDES 0x10c
44 #define SDHCI_TEGRA_CAP_OVERRIDES_DQS_TRIM_MASK 0x00003f00
45 #define SDHCI_TEGRA_CAP_OVERRIDES_DQS_TRIM_SHIFT 8
47 #define SDHCI_TEGRA_VENDOR_MISC_CTRL 0x120
48 #define SDHCI_MISC_CTRL_ERASE_TIMEOUT_LIMIT BIT(0)
49 #define SDHCI_MISC_CTRL_ENABLE_SDR104 0x8
50 #define SDHCI_MISC_CTRL_ENABLE_SDR50 0x10
51 #define SDHCI_MISC_CTRL_ENABLE_SDHCI_SPEC_300 0x20
52 #define SDHCI_MISC_CTRL_ENABLE_DDR50 0x200
54 #define SDHCI_TEGRA_VENDOR_DLLCAL_CFG 0x1b0
55 #define SDHCI_TEGRA_DLLCAL_CALIBRATE BIT(31)
57 #define SDHCI_TEGRA_VENDOR_DLLCAL_STA 0x1bc
58 #define SDHCI_TEGRA_DLLCAL_STA_ACTIVE BIT(31)
60 #define SDHCI_VNDR_TUN_CTRL0_0 0x1c0
61 #define SDHCI_VNDR_TUN_CTRL0_TUN_HW_TAP 0x20000
62 #define SDHCI_VNDR_TUN_CTRL0_START_TAP_VAL_MASK 0x03fc0000
63 #define SDHCI_VNDR_TUN_CTRL0_START_TAP_VAL_SHIFT 18
64 #define SDHCI_VNDR_TUN_CTRL0_MUL_M_MASK 0x00001fc0
65 #define SDHCI_VNDR_TUN_CTRL0_MUL_M_SHIFT 6
66 #define SDHCI_VNDR_TUN_CTRL0_TUN_ITER_MASK 0x000e000
67 #define SDHCI_VNDR_TUN_CTRL0_TUN_ITER_SHIFT 13
70 #define SDHCI_VNDR_TUN_CTRL0_TUN_WORD_SEL_MASK 0x7
72 #define SDHCI_TEGRA_VNDR_TUN_CTRL1_0 0x1c4
73 #define SDHCI_TEGRA_VNDR_TUN_STATUS0 0x1C8
74 #define SDHCI_TEGRA_VNDR_TUN_STATUS1 0x1CC
75 #define SDHCI_TEGRA_VNDR_TUN_STATUS1_TAP_MASK 0xFF
76 #define SDHCI_TEGRA_VNDR_TUN_STATUS1_END_TAP_SHIFT 0x8
77 #define TUNING_WORD_BIT_SIZE 32
79 #define SDHCI_TEGRA_AUTO_CAL_CONFIG 0x1e4
80 #define SDHCI_AUTO_CAL_START BIT(31)
81 #define SDHCI_AUTO_CAL_ENABLE BIT(29)
82 #define SDHCI_AUTO_CAL_PDPU_OFFSET_MASK 0x0000ffff
84 #define SDHCI_TEGRA_SDMEM_COMP_PADCTRL 0x1e0
85 #define SDHCI_TEGRA_SDMEM_COMP_PADCTRL_VREF_SEL_MASK 0x0000000f
86 #define SDHCI_TEGRA_SDMEM_COMP_PADCTRL_VREF_SEL_VAL 0x7
87 #define SDHCI_TEGRA_SDMEM_COMP_PADCTRL_E_INPUT_E_PWRD BIT(31)
88 #define SDHCI_COMP_PADCTRL_DRVUPDN_OFFSET_MASK 0x07FFF000
90 #define SDHCI_TEGRA_AUTO_CAL_STATUS 0x1ec
91 #define SDHCI_TEGRA_AUTO_CAL_ACTIVE BIT(31)
93 #define NVQUIRK_FORCE_SDHCI_SPEC_200 BIT(0)
94 #define NVQUIRK_ENABLE_BLOCK_GAP_DET BIT(1)
95 #define NVQUIRK_ENABLE_SDHCI_SPEC_300 BIT(2)
96 #define NVQUIRK_ENABLE_SDR50 BIT(3)
97 #define NVQUIRK_ENABLE_SDR104 BIT(4)
98 #define NVQUIRK_ENABLE_DDR50 BIT(5)
100 * HAS_PADCALIB NVQUIRK is for SoC's supporting auto calibration of pads
103 #define NVQUIRK_HAS_PADCALIB BIT(6)
105 * NEEDS_PAD_CONTROL NVQUIRK is for SoC's having separate 3V3 and 1V8 pads.
106 * 3V3/1V8 pad selection happens through pinctrl state selection depending
107 * on the signaling mode.
109 #define NVQUIRK_NEEDS_PAD_CONTROL BIT(7)
110 #define NVQUIRK_DIS_CARD_CLK_CONFIG_TAP BIT(8)
111 #define NVQUIRK_CQHCI_DCMD_R1B_CMD_TIMING BIT(9)
114 * NVQUIRK_HAS_TMCLK is for SoC's having separate timeout clock for Tegra
115 * SDMMC hardware data timeout.
117 #define NVQUIRK_HAS_TMCLK BIT(10)
119 /* SDMMC CQE Base Address for Tegra Host Ver 4.1 and Higher */
120 #define SDHCI_TEGRA_CQE_BASE_ADDR 0xF000
122 struct sdhci_tegra_soc_data
{
123 const struct sdhci_pltfm_data
*pdata
;
130 /* Magic pull up and pull down pad calibration offsets */
131 struct sdhci_tegra_autocal_offsets
{
134 u32 pull_up_3v3_timeout
;
135 u32 pull_down_3v3_timeout
;
138 u32 pull_up_1v8_timeout
;
139 u32 pull_down_1v8_timeout
;
141 u32 pull_down_sdr104
;
147 const struct sdhci_tegra_soc_data
*soc_data
;
148 struct gpio_desc
*power_gpio
;
151 bool pad_calib_required
;
152 bool pad_control_available
;
154 struct reset_control
*rst
;
155 struct pinctrl
*pinctrl_sdmmc
;
156 struct pinctrl_state
*pinctrl_state_3v3
;
157 struct pinctrl_state
*pinctrl_state_1v8
;
158 struct pinctrl_state
*pinctrl_state_3v3_drv
;
159 struct pinctrl_state
*pinctrl_state_1v8_drv
;
161 struct sdhci_tegra_autocal_offsets autocal_offsets
;
168 unsigned long curr_clk_rate
;
172 static u16
tegra_sdhci_readw(struct sdhci_host
*host
, int reg
)
174 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
175 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
176 const struct sdhci_tegra_soc_data
*soc_data
= tegra_host
->soc_data
;
178 if (unlikely((soc_data
->nvquirks
& NVQUIRK_FORCE_SDHCI_SPEC_200
) &&
179 (reg
== SDHCI_HOST_VERSION
))) {
180 /* Erratum: Version register is invalid in HW. */
181 return SDHCI_SPEC_200
;
184 return readw(host
->ioaddr
+ reg
);
187 static void tegra_sdhci_writew(struct sdhci_host
*host
, u16 val
, int reg
)
189 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
192 case SDHCI_TRANSFER_MODE
:
194 * Postpone this write, we must do it together with a
195 * command write that is down below.
197 pltfm_host
->xfer_mode_shadow
= val
;
200 writel((val
<< 16) | pltfm_host
->xfer_mode_shadow
,
201 host
->ioaddr
+ SDHCI_TRANSFER_MODE
);
205 writew(val
, host
->ioaddr
+ reg
);
208 static void tegra_sdhci_writel(struct sdhci_host
*host
, u32 val
, int reg
)
210 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
211 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
212 const struct sdhci_tegra_soc_data
*soc_data
= tegra_host
->soc_data
;
214 /* Seems like we're getting spurious timeout and crc errors, so
215 * disable signalling of them. In case of real errors software
216 * timers should take care of eventually detecting them.
218 if (unlikely(reg
== SDHCI_SIGNAL_ENABLE
))
219 val
&= ~(SDHCI_INT_TIMEOUT
|SDHCI_INT_CRC
);
221 writel(val
, host
->ioaddr
+ reg
);
223 if (unlikely((soc_data
->nvquirks
& NVQUIRK_ENABLE_BLOCK_GAP_DET
) &&
224 (reg
== SDHCI_INT_ENABLE
))) {
225 /* Erratum: Must enable block gap interrupt detection */
226 u8 gap_ctrl
= readb(host
->ioaddr
+ SDHCI_BLOCK_GAP_CONTROL
);
227 if (val
& SDHCI_INT_CARD_INT
)
231 writeb(gap_ctrl
, host
->ioaddr
+ SDHCI_BLOCK_GAP_CONTROL
);
235 static bool tegra_sdhci_configure_card_clk(struct sdhci_host
*host
, bool enable
)
240 reg
= sdhci_readw(host
, SDHCI_CLOCK_CONTROL
);
241 status
= !!(reg
& SDHCI_CLOCK_CARD_EN
);
243 if (status
== enable
)
247 reg
|= SDHCI_CLOCK_CARD_EN
;
249 reg
&= ~SDHCI_CLOCK_CARD_EN
;
251 sdhci_writew(host
, reg
, SDHCI_CLOCK_CONTROL
);
256 static void tegra210_sdhci_writew(struct sdhci_host
*host
, u16 val
, int reg
)
258 bool is_tuning_cmd
= 0;
262 if (reg
== SDHCI_COMMAND
) {
263 cmd
= SDHCI_GET_CMD(val
);
264 is_tuning_cmd
= cmd
== MMC_SEND_TUNING_BLOCK
||
265 cmd
== MMC_SEND_TUNING_BLOCK_HS200
;
269 clk_enabled
= tegra_sdhci_configure_card_clk(host
, 0);
271 writew(val
, host
->ioaddr
+ reg
);
275 sdhci_reset(host
, SDHCI_RESET_CMD
| SDHCI_RESET_DATA
);
276 tegra_sdhci_configure_card_clk(host
, clk_enabled
);
280 static unsigned int tegra_sdhci_get_ro(struct sdhci_host
*host
)
283 * Write-enable shall be assumed if GPIO is missing in a board's
284 * device-tree because SDHCI's WRITE_PROTECT bit doesn't work on
287 return mmc_gpio_get_ro(host
->mmc
);
290 static bool tegra_sdhci_is_pad_and_regulator_valid(struct sdhci_host
*host
)
292 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
293 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
294 int has_1v8
, has_3v3
;
297 * The SoCs which have NVQUIRK_NEEDS_PAD_CONTROL require software pad
298 * voltage configuration in order to perform voltage switching. This
299 * means that valid pinctrl info is required on SDHCI instances capable
300 * of performing voltage switching. Whether or not an SDHCI instance is
301 * capable of voltage switching is determined based on the regulator.
304 if (!(tegra_host
->soc_data
->nvquirks
& NVQUIRK_NEEDS_PAD_CONTROL
))
307 if (IS_ERR(host
->mmc
->supply
.vqmmc
))
310 has_1v8
= regulator_is_supported_voltage(host
->mmc
->supply
.vqmmc
,
313 has_3v3
= regulator_is_supported_voltage(host
->mmc
->supply
.vqmmc
,
316 if (has_1v8
== 1 && has_3v3
== 1)
317 return tegra_host
->pad_control_available
;
319 /* Fixed voltage, no pad control required. */
323 static void tegra_sdhci_set_tap(struct sdhci_host
*host
, unsigned int tap
)
325 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
326 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
327 const struct sdhci_tegra_soc_data
*soc_data
= tegra_host
->soc_data
;
328 bool card_clk_enabled
= false;
332 * Touching the tap values is a bit tricky on some SoC generations.
333 * The quirk enables a workaround for a glitch that sometimes occurs if
334 * the tap values are changed.
337 if (soc_data
->nvquirks
& NVQUIRK_DIS_CARD_CLK_CONFIG_TAP
)
338 card_clk_enabled
= tegra_sdhci_configure_card_clk(host
, false);
340 reg
= sdhci_readl(host
, SDHCI_TEGRA_VENDOR_CLOCK_CTRL
);
341 reg
&= ~SDHCI_CLOCK_CTRL_TAP_MASK
;
342 reg
|= tap
<< SDHCI_CLOCK_CTRL_TAP_SHIFT
;
343 sdhci_writel(host
, reg
, SDHCI_TEGRA_VENDOR_CLOCK_CTRL
);
345 if (soc_data
->nvquirks
& NVQUIRK_DIS_CARD_CLK_CONFIG_TAP
&&
348 sdhci_reset(host
, SDHCI_RESET_CMD
| SDHCI_RESET_DATA
);
349 tegra_sdhci_configure_card_clk(host
, card_clk_enabled
);
353 static void tegra_sdhci_hs400_enhanced_strobe(struct mmc_host
*mmc
,
356 struct sdhci_host
*host
= mmc_priv(mmc
);
359 val
= sdhci_readl(host
, SDHCI_TEGRA_VENDOR_SYS_SW_CTRL
);
361 if (ios
->enhanced_strobe
)
362 val
|= SDHCI_TEGRA_SYS_SW_CTRL_ENHANCED_STROBE
;
364 val
&= ~SDHCI_TEGRA_SYS_SW_CTRL_ENHANCED_STROBE
;
366 sdhci_writel(host
, val
, SDHCI_TEGRA_VENDOR_SYS_SW_CTRL
);
370 static void tegra_sdhci_reset(struct sdhci_host
*host
, u8 mask
)
372 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
373 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
374 const struct sdhci_tegra_soc_data
*soc_data
= tegra_host
->soc_data
;
375 u32 misc_ctrl
, clk_ctrl
, pad_ctrl
;
377 sdhci_reset(host
, mask
);
379 if (!(mask
& SDHCI_RESET_ALL
))
382 tegra_sdhci_set_tap(host
, tegra_host
->default_tap
);
384 misc_ctrl
= sdhci_readl(host
, SDHCI_TEGRA_VENDOR_MISC_CTRL
);
385 clk_ctrl
= sdhci_readl(host
, SDHCI_TEGRA_VENDOR_CLOCK_CTRL
);
387 misc_ctrl
&= ~(SDHCI_MISC_CTRL_ENABLE_SDHCI_SPEC_300
|
388 SDHCI_MISC_CTRL_ENABLE_SDR50
|
389 SDHCI_MISC_CTRL_ENABLE_DDR50
|
390 SDHCI_MISC_CTRL_ENABLE_SDR104
);
392 clk_ctrl
&= ~(SDHCI_CLOCK_CTRL_TRIM_MASK
|
393 SDHCI_CLOCK_CTRL_SPI_MODE_CLKEN_OVERRIDE
);
395 if (tegra_sdhci_is_pad_and_regulator_valid(host
)) {
396 /* Erratum: Enable SDHCI spec v3.00 support */
397 if (soc_data
->nvquirks
& NVQUIRK_ENABLE_SDHCI_SPEC_300
)
398 misc_ctrl
|= SDHCI_MISC_CTRL_ENABLE_SDHCI_SPEC_300
;
399 /* Advertise UHS modes as supported by host */
400 if (soc_data
->nvquirks
& NVQUIRK_ENABLE_SDR50
)
401 misc_ctrl
|= SDHCI_MISC_CTRL_ENABLE_SDR50
;
402 if (soc_data
->nvquirks
& NVQUIRK_ENABLE_DDR50
)
403 misc_ctrl
|= SDHCI_MISC_CTRL_ENABLE_DDR50
;
404 if (soc_data
->nvquirks
& NVQUIRK_ENABLE_SDR104
)
405 misc_ctrl
|= SDHCI_MISC_CTRL_ENABLE_SDR104
;
406 if (soc_data
->nvquirks
& NVQUIRK_ENABLE_SDR50
)
407 clk_ctrl
|= SDHCI_CLOCK_CTRL_SDR50_TUNING_OVERRIDE
;
410 clk_ctrl
|= tegra_host
->default_trim
<< SDHCI_CLOCK_CTRL_TRIM_SHIFT
;
412 sdhci_writel(host
, misc_ctrl
, SDHCI_TEGRA_VENDOR_MISC_CTRL
);
413 sdhci_writel(host
, clk_ctrl
, SDHCI_TEGRA_VENDOR_CLOCK_CTRL
);
415 if (soc_data
->nvquirks
& NVQUIRK_HAS_PADCALIB
) {
416 pad_ctrl
= sdhci_readl(host
, SDHCI_TEGRA_SDMEM_COMP_PADCTRL
);
417 pad_ctrl
&= ~SDHCI_TEGRA_SDMEM_COMP_PADCTRL_VREF_SEL_MASK
;
418 pad_ctrl
|= SDHCI_TEGRA_SDMEM_COMP_PADCTRL_VREF_SEL_VAL
;
419 sdhci_writel(host
, pad_ctrl
, SDHCI_TEGRA_SDMEM_COMP_PADCTRL
);
421 tegra_host
->pad_calib_required
= true;
424 tegra_host
->ddr_signaling
= false;
427 static void tegra_sdhci_configure_cal_pad(struct sdhci_host
*host
, bool enable
)
432 * Enable or disable the additional I/O pad used by the drive strength
433 * calibration process.
435 val
= sdhci_readl(host
, SDHCI_TEGRA_SDMEM_COMP_PADCTRL
);
438 val
|= SDHCI_TEGRA_SDMEM_COMP_PADCTRL_E_INPUT_E_PWRD
;
440 val
&= ~SDHCI_TEGRA_SDMEM_COMP_PADCTRL_E_INPUT_E_PWRD
;
442 sdhci_writel(host
, val
, SDHCI_TEGRA_SDMEM_COMP_PADCTRL
);
448 static void tegra_sdhci_set_pad_autocal_offset(struct sdhci_host
*host
,
453 reg
= sdhci_readl(host
, SDHCI_TEGRA_AUTO_CAL_CONFIG
);
454 reg
&= ~SDHCI_AUTO_CAL_PDPU_OFFSET_MASK
;
456 sdhci_writel(host
, reg
, SDHCI_TEGRA_AUTO_CAL_CONFIG
);
459 static int tegra_sdhci_set_padctrl(struct sdhci_host
*host
, int voltage
,
462 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
463 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
464 struct sdhci_tegra_autocal_offsets
*offsets
=
465 &tegra_host
->autocal_offsets
;
466 struct pinctrl_state
*pinctrl_drvupdn
= NULL
;
468 u8 drvup
= 0, drvdn
= 0;
471 if (!state_drvupdn
) {
472 /* PADS Drive Strength */
473 if (voltage
== MMC_SIGNAL_VOLTAGE_180
) {
474 if (tegra_host
->pinctrl_state_1v8_drv
) {
476 tegra_host
->pinctrl_state_1v8_drv
;
478 drvup
= offsets
->pull_up_1v8_timeout
;
479 drvdn
= offsets
->pull_down_1v8_timeout
;
482 if (tegra_host
->pinctrl_state_3v3_drv
) {
484 tegra_host
->pinctrl_state_3v3_drv
;
486 drvup
= offsets
->pull_up_3v3_timeout
;
487 drvdn
= offsets
->pull_down_3v3_timeout
;
491 if (pinctrl_drvupdn
!= NULL
) {
492 ret
= pinctrl_select_state(tegra_host
->pinctrl_sdmmc
,
495 dev_err(mmc_dev(host
->mmc
),
496 "failed pads drvupdn, ret: %d\n", ret
);
497 } else if ((drvup
) || (drvdn
)) {
498 reg
= sdhci_readl(host
,
499 SDHCI_TEGRA_SDMEM_COMP_PADCTRL
);
500 reg
&= ~SDHCI_COMP_PADCTRL_DRVUPDN_OFFSET_MASK
;
501 reg
|= (drvup
<< 20) | (drvdn
<< 12);
502 sdhci_writel(host
, reg
,
503 SDHCI_TEGRA_SDMEM_COMP_PADCTRL
);
507 /* Dual Voltage PADS Voltage selection */
508 if (!tegra_host
->pad_control_available
)
511 if (voltage
== MMC_SIGNAL_VOLTAGE_180
) {
512 ret
= pinctrl_select_state(tegra_host
->pinctrl_sdmmc
,
513 tegra_host
->pinctrl_state_1v8
);
515 dev_err(mmc_dev(host
->mmc
),
516 "setting 1.8V failed, ret: %d\n", ret
);
518 ret
= pinctrl_select_state(tegra_host
->pinctrl_sdmmc
,
519 tegra_host
->pinctrl_state_3v3
);
521 dev_err(mmc_dev(host
->mmc
),
522 "setting 3.3V failed, ret: %d\n", ret
);
529 static void tegra_sdhci_pad_autocalib(struct sdhci_host
*host
)
531 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
532 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
533 struct sdhci_tegra_autocal_offsets offsets
=
534 tegra_host
->autocal_offsets
;
535 struct mmc_ios
*ios
= &host
->mmc
->ios
;
536 bool card_clk_enabled
;
541 switch (ios
->timing
) {
542 case MMC_TIMING_UHS_SDR104
:
543 pdpu
= offsets
.pull_down_sdr104
<< 8 | offsets
.pull_up_sdr104
;
545 case MMC_TIMING_MMC_HS400
:
546 pdpu
= offsets
.pull_down_hs400
<< 8 | offsets
.pull_up_hs400
;
549 if (ios
->signal_voltage
== MMC_SIGNAL_VOLTAGE_180
)
550 pdpu
= offsets
.pull_down_1v8
<< 8 | offsets
.pull_up_1v8
;
552 pdpu
= offsets
.pull_down_3v3
<< 8 | offsets
.pull_up_3v3
;
555 /* Set initial offset before auto-calibration */
556 tegra_sdhci_set_pad_autocal_offset(host
, pdpu
);
558 card_clk_enabled
= tegra_sdhci_configure_card_clk(host
, false);
560 tegra_sdhci_configure_cal_pad(host
, true);
562 reg
= sdhci_readl(host
, SDHCI_TEGRA_AUTO_CAL_CONFIG
);
563 reg
|= SDHCI_AUTO_CAL_ENABLE
| SDHCI_AUTO_CAL_START
;
564 sdhci_writel(host
, reg
, SDHCI_TEGRA_AUTO_CAL_CONFIG
);
568 ret
= readl_poll_timeout(host
->ioaddr
+ SDHCI_TEGRA_AUTO_CAL_STATUS
,
569 reg
, !(reg
& SDHCI_TEGRA_AUTO_CAL_ACTIVE
),
572 tegra_sdhci_configure_cal_pad(host
, false);
574 tegra_sdhci_configure_card_clk(host
, card_clk_enabled
);
577 dev_err(mmc_dev(host
->mmc
), "Pad autocal timed out\n");
579 /* Disable automatic cal and use fixed Drive Strengths */
580 reg
= sdhci_readl(host
, SDHCI_TEGRA_AUTO_CAL_CONFIG
);
581 reg
&= ~SDHCI_AUTO_CAL_ENABLE
;
582 sdhci_writel(host
, reg
, SDHCI_TEGRA_AUTO_CAL_CONFIG
);
584 ret
= tegra_sdhci_set_padctrl(host
, ios
->signal_voltage
, false);
586 dev_err(mmc_dev(host
->mmc
),
587 "Setting drive strengths failed: %d\n", ret
);
591 static void tegra_sdhci_parse_pad_autocal_dt(struct sdhci_host
*host
)
593 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
594 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
595 struct sdhci_tegra_autocal_offsets
*autocal
=
596 &tegra_host
->autocal_offsets
;
599 err
= device_property_read_u32(host
->mmc
->parent
,
600 "nvidia,pad-autocal-pull-up-offset-3v3",
601 &autocal
->pull_up_3v3
);
603 autocal
->pull_up_3v3
= 0;
605 err
= device_property_read_u32(host
->mmc
->parent
,
606 "nvidia,pad-autocal-pull-down-offset-3v3",
607 &autocal
->pull_down_3v3
);
609 autocal
->pull_down_3v3
= 0;
611 err
= device_property_read_u32(host
->mmc
->parent
,
612 "nvidia,pad-autocal-pull-up-offset-1v8",
613 &autocal
->pull_up_1v8
);
615 autocal
->pull_up_1v8
= 0;
617 err
= device_property_read_u32(host
->mmc
->parent
,
618 "nvidia,pad-autocal-pull-down-offset-1v8",
619 &autocal
->pull_down_1v8
);
621 autocal
->pull_down_1v8
= 0;
623 err
= device_property_read_u32(host
->mmc
->parent
,
624 "nvidia,pad-autocal-pull-up-offset-sdr104",
625 &autocal
->pull_up_sdr104
);
627 autocal
->pull_up_sdr104
= autocal
->pull_up_1v8
;
629 err
= device_property_read_u32(host
->mmc
->parent
,
630 "nvidia,pad-autocal-pull-down-offset-sdr104",
631 &autocal
->pull_down_sdr104
);
633 autocal
->pull_down_sdr104
= autocal
->pull_down_1v8
;
635 err
= device_property_read_u32(host
->mmc
->parent
,
636 "nvidia,pad-autocal-pull-up-offset-hs400",
637 &autocal
->pull_up_hs400
);
639 autocal
->pull_up_hs400
= autocal
->pull_up_1v8
;
641 err
= device_property_read_u32(host
->mmc
->parent
,
642 "nvidia,pad-autocal-pull-down-offset-hs400",
643 &autocal
->pull_down_hs400
);
645 autocal
->pull_down_hs400
= autocal
->pull_down_1v8
;
648 * Different fail-safe drive strength values based on the signaling
649 * voltage are applicable for SoCs supporting 3V3 and 1V8 pad controls.
650 * So, avoid reading below device tree properties for SoCs that don't
651 * have NVQUIRK_NEEDS_PAD_CONTROL.
653 if (!(tegra_host
->soc_data
->nvquirks
& NVQUIRK_NEEDS_PAD_CONTROL
))
656 err
= device_property_read_u32(host
->mmc
->parent
,
657 "nvidia,pad-autocal-pull-up-offset-3v3-timeout",
658 &autocal
->pull_up_3v3_timeout
);
660 if (!IS_ERR(tegra_host
->pinctrl_state_3v3
) &&
661 (tegra_host
->pinctrl_state_3v3_drv
== NULL
))
662 pr_warn("%s: Missing autocal timeout 3v3-pad drvs\n",
663 mmc_hostname(host
->mmc
));
664 autocal
->pull_up_3v3_timeout
= 0;
667 err
= device_property_read_u32(host
->mmc
->parent
,
668 "nvidia,pad-autocal-pull-down-offset-3v3-timeout",
669 &autocal
->pull_down_3v3_timeout
);
671 if (!IS_ERR(tegra_host
->pinctrl_state_3v3
) &&
672 (tegra_host
->pinctrl_state_3v3_drv
== NULL
))
673 pr_warn("%s: Missing autocal timeout 3v3-pad drvs\n",
674 mmc_hostname(host
->mmc
));
675 autocal
->pull_down_3v3_timeout
= 0;
678 err
= device_property_read_u32(host
->mmc
->parent
,
679 "nvidia,pad-autocal-pull-up-offset-1v8-timeout",
680 &autocal
->pull_up_1v8_timeout
);
682 if (!IS_ERR(tegra_host
->pinctrl_state_1v8
) &&
683 (tegra_host
->pinctrl_state_1v8_drv
== NULL
))
684 pr_warn("%s: Missing autocal timeout 1v8-pad drvs\n",
685 mmc_hostname(host
->mmc
));
686 autocal
->pull_up_1v8_timeout
= 0;
689 err
= device_property_read_u32(host
->mmc
->parent
,
690 "nvidia,pad-autocal-pull-down-offset-1v8-timeout",
691 &autocal
->pull_down_1v8_timeout
);
693 if (!IS_ERR(tegra_host
->pinctrl_state_1v8
) &&
694 (tegra_host
->pinctrl_state_1v8_drv
== NULL
))
695 pr_warn("%s: Missing autocal timeout 1v8-pad drvs\n",
696 mmc_hostname(host
->mmc
));
697 autocal
->pull_down_1v8_timeout
= 0;
701 static void tegra_sdhci_request(struct mmc_host
*mmc
, struct mmc_request
*mrq
)
703 struct sdhci_host
*host
= mmc_priv(mmc
);
704 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
705 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
706 ktime_t since_calib
= ktime_sub(ktime_get(), tegra_host
->last_calib
);
708 /* 100 ms calibration interval is specified in the TRM */
709 if (ktime_to_ms(since_calib
) > 100) {
710 tegra_sdhci_pad_autocalib(host
);
711 tegra_host
->last_calib
= ktime_get();
714 sdhci_request(mmc
, mrq
);
717 static void tegra_sdhci_parse_tap_and_trim(struct sdhci_host
*host
)
719 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
720 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
723 err
= device_property_read_u32(host
->mmc
->parent
, "nvidia,default-tap",
724 &tegra_host
->default_tap
);
726 tegra_host
->default_tap
= 0;
728 err
= device_property_read_u32(host
->mmc
->parent
, "nvidia,default-trim",
729 &tegra_host
->default_trim
);
731 tegra_host
->default_trim
= 0;
733 err
= device_property_read_u32(host
->mmc
->parent
, "nvidia,dqs-trim",
734 &tegra_host
->dqs_trim
);
736 tegra_host
->dqs_trim
= 0x11;
739 static void tegra_sdhci_parse_dt(struct sdhci_host
*host
)
741 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
742 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
744 if (device_property_read_bool(host
->mmc
->parent
, "supports-cqe"))
745 tegra_host
->enable_hwcq
= true;
747 tegra_host
->enable_hwcq
= false;
749 tegra_sdhci_parse_pad_autocal_dt(host
);
750 tegra_sdhci_parse_tap_and_trim(host
);
753 static void tegra_sdhci_set_clock(struct sdhci_host
*host
, unsigned int clock
)
755 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
756 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
757 unsigned long host_clk
;
760 return sdhci_set_clock(host
, clock
);
763 * In DDR50/52 modes the Tegra SDHCI controllers require the SDHCI
764 * divider to be configured to divided the host clock by two. The SDHCI
765 * clock divider is calculated as part of sdhci_set_clock() by
766 * sdhci_calc_clk(). The divider is calculated from host->max_clk and
767 * the requested clock rate.
769 * By setting the host->max_clk to clock * 2 the divider calculation
770 * will always result in the correct value for DDR50/52 modes,
771 * regardless of clock rate rounding, which may happen if the value
772 * from clk_get_rate() is used.
774 host_clk
= tegra_host
->ddr_signaling
? clock
* 2 : clock
;
775 clk_set_rate(pltfm_host
->clk
, host_clk
);
776 tegra_host
->curr_clk_rate
= host_clk
;
777 if (tegra_host
->ddr_signaling
)
778 host
->max_clk
= host_clk
;
780 host
->max_clk
= clk_get_rate(pltfm_host
->clk
);
782 sdhci_set_clock(host
, clock
);
784 if (tegra_host
->pad_calib_required
) {
785 tegra_sdhci_pad_autocalib(host
);
786 tegra_host
->pad_calib_required
= false;
790 static unsigned int tegra_sdhci_get_max_clock(struct sdhci_host
*host
)
792 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
794 return clk_round_rate(pltfm_host
->clk
, UINT_MAX
);
797 static void tegra_sdhci_set_dqs_trim(struct sdhci_host
*host
, u8 trim
)
801 val
= sdhci_readl(host
, SDHCI_TEGRA_VENDOR_CAP_OVERRIDES
);
802 val
&= ~SDHCI_TEGRA_CAP_OVERRIDES_DQS_TRIM_MASK
;
803 val
|= trim
<< SDHCI_TEGRA_CAP_OVERRIDES_DQS_TRIM_SHIFT
;
804 sdhci_writel(host
, val
, SDHCI_TEGRA_VENDOR_CAP_OVERRIDES
);
807 static void tegra_sdhci_hs400_dll_cal(struct sdhci_host
*host
)
812 reg
= sdhci_readl(host
, SDHCI_TEGRA_VENDOR_DLLCAL_CFG
);
813 reg
|= SDHCI_TEGRA_DLLCAL_CALIBRATE
;
814 sdhci_writel(host
, reg
, SDHCI_TEGRA_VENDOR_DLLCAL_CFG
);
816 /* 1 ms sleep, 5 ms timeout */
817 err
= readl_poll_timeout(host
->ioaddr
+ SDHCI_TEGRA_VENDOR_DLLCAL_STA
,
818 reg
, !(reg
& SDHCI_TEGRA_DLLCAL_STA_ACTIVE
),
821 dev_err(mmc_dev(host
->mmc
),
822 "HS400 delay line calibration timed out\n");
825 static void tegra_sdhci_tap_correction(struct sdhci_host
*host
, u8 thd_up
,
826 u8 thd_low
, u8 fixed_tap
)
828 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
829 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
831 u8 word
, bit
, edge1
, tap
, window
;
833 bool start_fail
= false;
834 bool start_pass
= false;
835 bool end_pass
= false;
836 bool first_fail
= false;
837 bool first_pass
= false;
838 u8 start_pass_tap
= 0;
840 u8 first_fail_tap
= 0;
841 u8 first_pass_tap
= 0;
842 u8 total_tuning_words
= host
->tuning_loop_count
/ TUNING_WORD_BIT_SIZE
;
845 * Read auto-tuned results and extract good valid passing window by
846 * filtering out un-wanted bubble/partial/merged windows.
848 for (word
= 0; word
< total_tuning_words
; word
++) {
849 val
= sdhci_readl(host
, SDHCI_VNDR_TUN_CTRL0_0
);
850 val
&= ~SDHCI_VNDR_TUN_CTRL0_TUN_WORD_SEL_MASK
;
852 sdhci_writel(host
, val
, SDHCI_VNDR_TUN_CTRL0_0
);
853 tun_status
= sdhci_readl(host
, SDHCI_TEGRA_VNDR_TUN_STATUS0
);
855 while (bit
< TUNING_WORD_BIT_SIZE
) {
856 tap
= word
* TUNING_WORD_BIT_SIZE
+ bit
;
857 tap_result
= tun_status
& (1 << bit
);
858 if (!tap_result
&& !start_fail
) {
861 first_fail_tap
= tap
;
865 } else if (tap_result
&& start_fail
&& !start_pass
) {
866 start_pass_tap
= tap
;
869 first_pass_tap
= tap
;
873 } else if (!tap_result
&& start_fail
&& start_pass
&&
875 end_pass_tap
= tap
- 1;
877 } else if (tap_result
&& start_pass
&& start_fail
&&
879 window
= end_pass_tap
- start_pass_tap
;
880 /* discard merged window and bubble window */
881 if (window
>= thd_up
|| window
< thd_low
) {
882 start_pass_tap
= tap
;
885 /* set tap at middle of valid window */
886 tap
= start_pass_tap
+ window
/ 2;
887 tegra_host
->tuned_tap_delay
= tap
;
897 WARN(1, "no edge detected, continue with hw tuned delay.\n");
898 } else if (first_pass
) {
899 /* set tap location at fixed tap relative to the first edge */
900 edge1
= first_fail_tap
+ (first_pass_tap
- first_fail_tap
) / 2;
901 if (edge1
- 1 > fixed_tap
)
902 tegra_host
->tuned_tap_delay
= edge1
- fixed_tap
;
904 tegra_host
->tuned_tap_delay
= edge1
+ fixed_tap
;
908 static void tegra_sdhci_post_tuning(struct sdhci_host
*host
)
910 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
911 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
912 const struct sdhci_tegra_soc_data
*soc_data
= tegra_host
->soc_data
;
913 u32 avg_tap_dly
, val
, min_tap_dly
, max_tap_dly
;
914 u8 fixed_tap
, start_tap
, end_tap
, window_width
;
915 u8 thdupper
, thdlower
;
917 u32 clk_rate_mhz
, period_ps
, bestcase
, worstcase
;
919 /* retain HW tuned tap to use incase if no correction is needed */
920 val
= sdhci_readl(host
, SDHCI_TEGRA_VENDOR_CLOCK_CTRL
);
921 tegra_host
->tuned_tap_delay
= (val
& SDHCI_CLOCK_CTRL_TAP_MASK
) >>
922 SDHCI_CLOCK_CTRL_TAP_SHIFT
;
923 if (soc_data
->min_tap_delay
&& soc_data
->max_tap_delay
) {
924 min_tap_dly
= soc_data
->min_tap_delay
;
925 max_tap_dly
= soc_data
->max_tap_delay
;
926 clk_rate_mhz
= tegra_host
->curr_clk_rate
/ USEC_PER_SEC
;
927 period_ps
= USEC_PER_SEC
/ clk_rate_mhz
;
928 bestcase
= period_ps
/ min_tap_dly
;
929 worstcase
= period_ps
/ max_tap_dly
;
931 * Upper and Lower bound thresholds used to detect merged and
934 thdupper
= (2 * worstcase
+ bestcase
) / 2;
935 thdlower
= worstcase
/ 4;
937 * fixed tap is used when HW tuning result contains single edge
938 * and tap is set at fixed tap delay relative to the first edge
940 avg_tap_dly
= (period_ps
* 2) / (min_tap_dly
+ max_tap_dly
);
941 fixed_tap
= avg_tap_dly
/ 2;
943 val
= sdhci_readl(host
, SDHCI_TEGRA_VNDR_TUN_STATUS1
);
944 start_tap
= val
& SDHCI_TEGRA_VNDR_TUN_STATUS1_TAP_MASK
;
945 end_tap
= (val
>> SDHCI_TEGRA_VNDR_TUN_STATUS1_END_TAP_SHIFT
) &
946 SDHCI_TEGRA_VNDR_TUN_STATUS1_TAP_MASK
;
947 window_width
= end_tap
- start_tap
;
948 num_iter
= host
->tuning_loop_count
;
950 * partial window includes edges of the tuning range.
951 * merged window includes more taps so window width is higher
952 * than upper threshold.
954 if (start_tap
== 0 || (end_tap
== (num_iter
- 1)) ||
955 (end_tap
== num_iter
- 2) || window_width
>= thdupper
) {
956 pr_debug("%s: Apply tuning correction\n",
957 mmc_hostname(host
->mmc
));
958 tegra_sdhci_tap_correction(host
, thdupper
, thdlower
,
963 tegra_sdhci_set_tap(host
, tegra_host
->tuned_tap_delay
);
966 static int tegra_sdhci_execute_hw_tuning(struct mmc_host
*mmc
, u32 opcode
)
968 struct sdhci_host
*host
= mmc_priv(mmc
);
971 err
= sdhci_execute_tuning(mmc
, opcode
);
972 if (!err
&& !host
->tuning_err
)
973 tegra_sdhci_post_tuning(host
);
978 static void tegra_sdhci_set_uhs_signaling(struct sdhci_host
*host
,
981 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
982 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
983 bool set_default_tap
= false;
984 bool set_dqs_trim
= false;
985 bool do_hs400_dll_cal
= false;
989 tegra_host
->ddr_signaling
= false;
991 case MMC_TIMING_UHS_SDR50
:
993 case MMC_TIMING_UHS_SDR104
:
994 case MMC_TIMING_MMC_HS200
:
995 /* Don't set default tap on tunable modes. */
998 case MMC_TIMING_MMC_HS400
:
1000 do_hs400_dll_cal
= true;
1003 case MMC_TIMING_MMC_DDR52
:
1004 case MMC_TIMING_UHS_DDR50
:
1005 tegra_host
->ddr_signaling
= true;
1006 set_default_tap
= true;
1009 set_default_tap
= true;
1013 val
= sdhci_readl(host
, SDHCI_VNDR_TUN_CTRL0_0
);
1014 val
&= ~(SDHCI_VNDR_TUN_CTRL0_TUN_ITER_MASK
|
1015 SDHCI_VNDR_TUN_CTRL0_START_TAP_VAL_MASK
|
1016 SDHCI_VNDR_TUN_CTRL0_MUL_M_MASK
);
1017 val
|= (iter
<< SDHCI_VNDR_TUN_CTRL0_TUN_ITER_SHIFT
|
1018 0 << SDHCI_VNDR_TUN_CTRL0_START_TAP_VAL_SHIFT
|
1019 1 << SDHCI_VNDR_TUN_CTRL0_MUL_M_SHIFT
);
1020 sdhci_writel(host
, val
, SDHCI_VNDR_TUN_CTRL0_0
);
1021 sdhci_writel(host
, 0, SDHCI_TEGRA_VNDR_TUN_CTRL1_0
);
1023 host
->tuning_loop_count
= (iter
== TRIES_128
) ? 128 : 256;
1025 sdhci_set_uhs_signaling(host
, timing
);
1027 tegra_sdhci_pad_autocalib(host
);
1029 if (tegra_host
->tuned_tap_delay
&& !set_default_tap
)
1030 tegra_sdhci_set_tap(host
, tegra_host
->tuned_tap_delay
);
1032 tegra_sdhci_set_tap(host
, tegra_host
->default_tap
);
1035 tegra_sdhci_set_dqs_trim(host
, tegra_host
->dqs_trim
);
1037 if (do_hs400_dll_cal
)
1038 tegra_sdhci_hs400_dll_cal(host
);
1041 static int tegra_sdhci_execute_tuning(struct sdhci_host
*host
, u32 opcode
)
1043 unsigned int min
, max
;
1046 * Start search for minimum tap value at 10, as smaller values are
1047 * may wrongly be reported as working but fail at higher speeds,
1048 * according to the TRM.
1052 tegra_sdhci_set_tap(host
, min
);
1053 if (!mmc_send_tuning(host
->mmc
, opcode
, NULL
))
1058 /* Find the maximum tap value that still passes. */
1061 tegra_sdhci_set_tap(host
, max
);
1062 if (mmc_send_tuning(host
->mmc
, opcode
, NULL
)) {
1069 /* The TRM states the ideal tap value is at 75% in the passing range. */
1070 tegra_sdhci_set_tap(host
, min
+ ((max
- min
) * 3 / 4));
1072 return mmc_send_tuning(host
->mmc
, opcode
, NULL
);
1075 static int sdhci_tegra_start_signal_voltage_switch(struct mmc_host
*mmc
,
1076 struct mmc_ios
*ios
)
1078 struct sdhci_host
*host
= mmc_priv(mmc
);
1079 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
1080 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
1083 if (ios
->signal_voltage
== MMC_SIGNAL_VOLTAGE_330
) {
1084 ret
= tegra_sdhci_set_padctrl(host
, ios
->signal_voltage
, true);
1087 ret
= sdhci_start_signal_voltage_switch(mmc
, ios
);
1088 } else if (ios
->signal_voltage
== MMC_SIGNAL_VOLTAGE_180
) {
1089 ret
= sdhci_start_signal_voltage_switch(mmc
, ios
);
1092 ret
= tegra_sdhci_set_padctrl(host
, ios
->signal_voltage
, true);
1095 if (tegra_host
->pad_calib_required
)
1096 tegra_sdhci_pad_autocalib(host
);
1101 static int tegra_sdhci_init_pinctrl_info(struct device
*dev
,
1102 struct sdhci_tegra
*tegra_host
)
1104 tegra_host
->pinctrl_sdmmc
= devm_pinctrl_get(dev
);
1105 if (IS_ERR(tegra_host
->pinctrl_sdmmc
)) {
1106 dev_dbg(dev
, "No pinctrl info, err: %ld\n",
1107 PTR_ERR(tegra_host
->pinctrl_sdmmc
));
1111 tegra_host
->pinctrl_state_1v8_drv
= pinctrl_lookup_state(
1112 tegra_host
->pinctrl_sdmmc
, "sdmmc-1v8-drv");
1113 if (IS_ERR(tegra_host
->pinctrl_state_1v8_drv
)) {
1114 if (PTR_ERR(tegra_host
->pinctrl_state_1v8_drv
) == -ENODEV
)
1115 tegra_host
->pinctrl_state_1v8_drv
= NULL
;
1118 tegra_host
->pinctrl_state_3v3_drv
= pinctrl_lookup_state(
1119 tegra_host
->pinctrl_sdmmc
, "sdmmc-3v3-drv");
1120 if (IS_ERR(tegra_host
->pinctrl_state_3v3_drv
)) {
1121 if (PTR_ERR(tegra_host
->pinctrl_state_3v3_drv
) == -ENODEV
)
1122 tegra_host
->pinctrl_state_3v3_drv
= NULL
;
1125 tegra_host
->pinctrl_state_3v3
=
1126 pinctrl_lookup_state(tegra_host
->pinctrl_sdmmc
, "sdmmc-3v3");
1127 if (IS_ERR(tegra_host
->pinctrl_state_3v3
)) {
1128 dev_warn(dev
, "Missing 3.3V pad state, err: %ld\n",
1129 PTR_ERR(tegra_host
->pinctrl_state_3v3
));
1133 tegra_host
->pinctrl_state_1v8
=
1134 pinctrl_lookup_state(tegra_host
->pinctrl_sdmmc
, "sdmmc-1v8");
1135 if (IS_ERR(tegra_host
->pinctrl_state_1v8
)) {
1136 dev_warn(dev
, "Missing 1.8V pad state, err: %ld\n",
1137 PTR_ERR(tegra_host
->pinctrl_state_1v8
));
1141 tegra_host
->pad_control_available
= true;
1146 static void tegra_sdhci_voltage_switch(struct sdhci_host
*host
)
1148 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
1149 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
1150 const struct sdhci_tegra_soc_data
*soc_data
= tegra_host
->soc_data
;
1152 if (soc_data
->nvquirks
& NVQUIRK_HAS_PADCALIB
)
1153 tegra_host
->pad_calib_required
= true;
1156 static void tegra_cqhci_writel(struct cqhci_host
*cq_host
, u32 val
, int reg
)
1158 struct mmc_host
*mmc
= cq_host
->mmc
;
1164 * During CQE resume/unhalt, CQHCI driver unhalts CQE prior to
1165 * cqhci_host_ops enable where SDHCI DMA and BLOCK_SIZE registers need
1166 * to be re-configured.
1167 * Tegra CQHCI/SDHCI prevents write access to block size register when
1168 * CQE is unhalted. So handling CQE resume sequence here to configure
1169 * SDHCI block registers prior to exiting CQE halt state.
1171 if (reg
== CQHCI_CTL
&& !(val
& CQHCI_HALT
) &&
1172 cqhci_readl(cq_host
, CQHCI_CTL
) & CQHCI_HALT
) {
1173 sdhci_cqe_enable(mmc
);
1174 writel(val
, cq_host
->mmio
+ reg
);
1175 timeout
= ktime_add_us(ktime_get(), 50);
1177 timed_out
= ktime_compare(ktime_get(), timeout
) > 0;
1178 ctrl
= cqhci_readl(cq_host
, CQHCI_CTL
);
1179 if (!(ctrl
& CQHCI_HALT
) || timed_out
)
1183 * CQE usually resumes very quick, but incase if Tegra CQE
1184 * doesn't resume retry unhalt.
1187 writel(val
, cq_host
->mmio
+ reg
);
1189 writel(val
, cq_host
->mmio
+ reg
);
1193 static void sdhci_tegra_update_dcmd_desc(struct mmc_host
*mmc
,
1194 struct mmc_request
*mrq
, u64
*data
)
1196 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(mmc_priv(mmc
));
1197 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
1198 const struct sdhci_tegra_soc_data
*soc_data
= tegra_host
->soc_data
;
1200 if (soc_data
->nvquirks
& NVQUIRK_CQHCI_DCMD_R1B_CMD_TIMING
&&
1201 mrq
->cmd
->flags
& MMC_RSP_R1B
)
1202 *data
|= CQHCI_CMD_TIMING(1);
1205 static void sdhci_tegra_cqe_enable(struct mmc_host
*mmc
)
1207 struct cqhci_host
*cq_host
= mmc
->cqe_private
;
1211 * Tegra CQHCI/SDMMC design prevents write access to sdhci block size
1212 * register when CQE is enabled and unhalted.
1213 * CQHCI driver enables CQE prior to activation, so disable CQE before
1214 * programming block size in sdhci controller and enable it back.
1216 if (!cq_host
->activated
) {
1217 val
= cqhci_readl(cq_host
, CQHCI_CFG
);
1218 if (val
& CQHCI_ENABLE
)
1219 cqhci_writel(cq_host
, (val
& ~CQHCI_ENABLE
),
1221 sdhci_cqe_enable(mmc
);
1222 if (val
& CQHCI_ENABLE
)
1223 cqhci_writel(cq_host
, val
, CQHCI_CFG
);
1227 * CMD CRC errors are seen sometimes with some eMMC devices when status
1228 * command is sent during transfer of last data block which is the
1229 * default case as send status command block counter (CBC) is 1.
1230 * Recommended fix to set CBC to 0 allowing send status command only
1231 * when data lines are idle.
1233 val
= cqhci_readl(cq_host
, CQHCI_SSC1
);
1234 val
&= ~CQHCI_SSC1_CBC_MASK
;
1235 cqhci_writel(cq_host
, val
, CQHCI_SSC1
);
1238 static void sdhci_tegra_dumpregs(struct mmc_host
*mmc
)
1240 sdhci_dumpregs(mmc_priv(mmc
));
1243 static u32
sdhci_tegra_cqhci_irq(struct sdhci_host
*host
, u32 intmask
)
1248 if (!sdhci_cqe_irq(host
, intmask
, &cmd_error
, &data_error
))
1251 cqhci_irq(host
->mmc
, intmask
, cmd_error
, data_error
);
1256 static void tegra_sdhci_set_timeout(struct sdhci_host
*host
,
1257 struct mmc_command
*cmd
)
1262 * HW busy detection timeout is based on programmed data timeout
1263 * counter and maximum supported timeout is 11s which may not be
1264 * enough for long operations like cache flush, sleep awake, erase.
1266 * ERASE_TIMEOUT_LIMIT bit of VENDOR_MISC_CTRL register allows
1267 * host controller to wait for busy state until the card is busy
1268 * without HW timeout.
1270 * So, use infinite busy wait mode for operations that may take
1271 * more than maximum HW busy timeout of 11s otherwise use finite
1274 val
= sdhci_readl(host
, SDHCI_TEGRA_VENDOR_MISC_CTRL
);
1275 if (cmd
&& cmd
->busy_timeout
>= 11 * MSEC_PER_SEC
)
1276 val
|= SDHCI_MISC_CTRL_ERASE_TIMEOUT_LIMIT
;
1278 val
&= ~SDHCI_MISC_CTRL_ERASE_TIMEOUT_LIMIT
;
1279 sdhci_writel(host
, val
, SDHCI_TEGRA_VENDOR_MISC_CTRL
);
1281 __sdhci_set_timeout(host
, cmd
);
1284 static const struct cqhci_host_ops sdhci_tegra_cqhci_ops
= {
1285 .write_l
= tegra_cqhci_writel
,
1286 .enable
= sdhci_tegra_cqe_enable
,
1287 .disable
= sdhci_cqe_disable
,
1288 .dumpregs
= sdhci_tegra_dumpregs
,
1289 .update_dcmd_desc
= sdhci_tegra_update_dcmd_desc
,
1292 static int tegra_sdhci_set_dma_mask(struct sdhci_host
*host
)
1294 struct sdhci_pltfm_host
*platform
= sdhci_priv(host
);
1295 struct sdhci_tegra
*tegra
= sdhci_pltfm_priv(platform
);
1296 const struct sdhci_tegra_soc_data
*soc
= tegra
->soc_data
;
1297 struct device
*dev
= mmc_dev(host
->mmc
);
1300 return dma_set_mask_and_coherent(dev
, soc
->dma_mask
);
1305 static const struct sdhci_ops tegra_sdhci_ops
= {
1306 .get_ro
= tegra_sdhci_get_ro
,
1307 .read_w
= tegra_sdhci_readw
,
1308 .write_l
= tegra_sdhci_writel
,
1309 .set_clock
= tegra_sdhci_set_clock
,
1310 .set_dma_mask
= tegra_sdhci_set_dma_mask
,
1311 .set_bus_width
= sdhci_set_bus_width
,
1312 .reset
= tegra_sdhci_reset
,
1313 .platform_execute_tuning
= tegra_sdhci_execute_tuning
,
1314 .set_uhs_signaling
= tegra_sdhci_set_uhs_signaling
,
1315 .voltage_switch
= tegra_sdhci_voltage_switch
,
1316 .get_max_clock
= tegra_sdhci_get_max_clock
,
1319 static const struct sdhci_pltfm_data sdhci_tegra20_pdata
= {
1320 .quirks
= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL
|
1321 SDHCI_QUIRK_SINGLE_POWER_WRITE
|
1322 SDHCI_QUIRK_NO_HISPD_BIT
|
1323 SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC
|
1324 SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN
,
1325 .ops
= &tegra_sdhci_ops
,
1328 static const struct sdhci_tegra_soc_data soc_data_tegra20
= {
1329 .pdata
= &sdhci_tegra20_pdata
,
1330 .dma_mask
= DMA_BIT_MASK(32),
1331 .nvquirks
= NVQUIRK_FORCE_SDHCI_SPEC_200
|
1332 NVQUIRK_ENABLE_BLOCK_GAP_DET
,
1335 static const struct sdhci_pltfm_data sdhci_tegra30_pdata
= {
1336 .quirks
= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL
|
1337 SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK
|
1338 SDHCI_QUIRK_SINGLE_POWER_WRITE
|
1339 SDHCI_QUIRK_NO_HISPD_BIT
|
1340 SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC
|
1341 SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN
,
1342 .quirks2
= SDHCI_QUIRK2_PRESET_VALUE_BROKEN
|
1343 SDHCI_QUIRK2_BROKEN_HS200
|
1345 * Auto-CMD23 leads to "Got command interrupt 0x00010000 even
1346 * though no command operation was in progress."
1348 * The exact reason is unknown, as the same hardware seems
1349 * to support Auto CMD23 on a downstream 3.1 kernel.
1351 SDHCI_QUIRK2_ACMD23_BROKEN
,
1352 .ops
= &tegra_sdhci_ops
,
1355 static const struct sdhci_tegra_soc_data soc_data_tegra30
= {
1356 .pdata
= &sdhci_tegra30_pdata
,
1357 .dma_mask
= DMA_BIT_MASK(32),
1358 .nvquirks
= NVQUIRK_ENABLE_SDHCI_SPEC_300
|
1359 NVQUIRK_ENABLE_SDR50
|
1360 NVQUIRK_ENABLE_SDR104
|
1361 NVQUIRK_HAS_PADCALIB
,
1364 static const struct sdhci_ops tegra114_sdhci_ops
= {
1365 .get_ro
= tegra_sdhci_get_ro
,
1366 .read_w
= tegra_sdhci_readw
,
1367 .write_w
= tegra_sdhci_writew
,
1368 .write_l
= tegra_sdhci_writel
,
1369 .set_clock
= tegra_sdhci_set_clock
,
1370 .set_dma_mask
= tegra_sdhci_set_dma_mask
,
1371 .set_bus_width
= sdhci_set_bus_width
,
1372 .reset
= tegra_sdhci_reset
,
1373 .platform_execute_tuning
= tegra_sdhci_execute_tuning
,
1374 .set_uhs_signaling
= tegra_sdhci_set_uhs_signaling
,
1375 .voltage_switch
= tegra_sdhci_voltage_switch
,
1376 .get_max_clock
= tegra_sdhci_get_max_clock
,
1379 static const struct sdhci_pltfm_data sdhci_tegra114_pdata
= {
1380 .quirks
= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL
|
1381 SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK
|
1382 SDHCI_QUIRK_SINGLE_POWER_WRITE
|
1383 SDHCI_QUIRK_NO_HISPD_BIT
|
1384 SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC
|
1385 SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN
,
1386 .quirks2
= SDHCI_QUIRK2_PRESET_VALUE_BROKEN
,
1387 .ops
= &tegra114_sdhci_ops
,
1390 static const struct sdhci_tegra_soc_data soc_data_tegra114
= {
1391 .pdata
= &sdhci_tegra114_pdata
,
1392 .dma_mask
= DMA_BIT_MASK(32),
1395 static const struct sdhci_pltfm_data sdhci_tegra124_pdata
= {
1396 .quirks
= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL
|
1397 SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK
|
1398 SDHCI_QUIRK_SINGLE_POWER_WRITE
|
1399 SDHCI_QUIRK_NO_HISPD_BIT
|
1400 SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC
|
1401 SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN
,
1402 .quirks2
= SDHCI_QUIRK2_PRESET_VALUE_BROKEN
,
1403 .ops
= &tegra114_sdhci_ops
,
1406 static const struct sdhci_tegra_soc_data soc_data_tegra124
= {
1407 .pdata
= &sdhci_tegra124_pdata
,
1408 .dma_mask
= DMA_BIT_MASK(34),
1411 static const struct sdhci_ops tegra210_sdhci_ops
= {
1412 .get_ro
= tegra_sdhci_get_ro
,
1413 .read_w
= tegra_sdhci_readw
,
1414 .write_w
= tegra210_sdhci_writew
,
1415 .write_l
= tegra_sdhci_writel
,
1416 .set_clock
= tegra_sdhci_set_clock
,
1417 .set_dma_mask
= tegra_sdhci_set_dma_mask
,
1418 .set_bus_width
= sdhci_set_bus_width
,
1419 .reset
= tegra_sdhci_reset
,
1420 .set_uhs_signaling
= tegra_sdhci_set_uhs_signaling
,
1421 .voltage_switch
= tegra_sdhci_voltage_switch
,
1422 .get_max_clock
= tegra_sdhci_get_max_clock
,
1423 .set_timeout
= tegra_sdhci_set_timeout
,
1426 static const struct sdhci_pltfm_data sdhci_tegra210_pdata
= {
1427 .quirks
= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL
|
1428 SDHCI_QUIRK_SINGLE_POWER_WRITE
|
1429 SDHCI_QUIRK_NO_HISPD_BIT
|
1430 SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC
|
1431 SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN
,
1432 .quirks2
= SDHCI_QUIRK2_PRESET_VALUE_BROKEN
,
1433 .ops
= &tegra210_sdhci_ops
,
1436 static const struct sdhci_tegra_soc_data soc_data_tegra210
= {
1437 .pdata
= &sdhci_tegra210_pdata
,
1438 .dma_mask
= DMA_BIT_MASK(34),
1439 .nvquirks
= NVQUIRK_NEEDS_PAD_CONTROL
|
1440 NVQUIRK_HAS_PADCALIB
|
1441 NVQUIRK_DIS_CARD_CLK_CONFIG_TAP
|
1442 NVQUIRK_ENABLE_SDR50
|
1443 NVQUIRK_ENABLE_SDR104
|
1445 .min_tap_delay
= 106,
1446 .max_tap_delay
= 185,
1449 static const struct sdhci_ops tegra186_sdhci_ops
= {
1450 .get_ro
= tegra_sdhci_get_ro
,
1451 .read_w
= tegra_sdhci_readw
,
1452 .write_l
= tegra_sdhci_writel
,
1453 .set_clock
= tegra_sdhci_set_clock
,
1454 .set_dma_mask
= tegra_sdhci_set_dma_mask
,
1455 .set_bus_width
= sdhci_set_bus_width
,
1456 .reset
= tegra_sdhci_reset
,
1457 .set_uhs_signaling
= tegra_sdhci_set_uhs_signaling
,
1458 .voltage_switch
= tegra_sdhci_voltage_switch
,
1459 .get_max_clock
= tegra_sdhci_get_max_clock
,
1460 .irq
= sdhci_tegra_cqhci_irq
,
1461 .set_timeout
= tegra_sdhci_set_timeout
,
1464 static const struct sdhci_pltfm_data sdhci_tegra186_pdata
= {
1465 .quirks
= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL
|
1466 SDHCI_QUIRK_SINGLE_POWER_WRITE
|
1467 SDHCI_QUIRK_NO_HISPD_BIT
|
1468 SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC
|
1469 SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN
,
1470 .quirks2
= SDHCI_QUIRK2_PRESET_VALUE_BROKEN
,
1471 .ops
= &tegra186_sdhci_ops
,
1474 static const struct sdhci_tegra_soc_data soc_data_tegra186
= {
1475 .pdata
= &sdhci_tegra186_pdata
,
1476 .dma_mask
= DMA_BIT_MASK(40),
1477 .nvquirks
= NVQUIRK_NEEDS_PAD_CONTROL
|
1478 NVQUIRK_HAS_PADCALIB
|
1479 NVQUIRK_DIS_CARD_CLK_CONFIG_TAP
|
1480 NVQUIRK_ENABLE_SDR50
|
1481 NVQUIRK_ENABLE_SDR104
|
1483 NVQUIRK_CQHCI_DCMD_R1B_CMD_TIMING
,
1484 .min_tap_delay
= 84,
1485 .max_tap_delay
= 136,
1488 static const struct sdhci_tegra_soc_data soc_data_tegra194
= {
1489 .pdata
= &sdhci_tegra186_pdata
,
1490 .dma_mask
= DMA_BIT_MASK(39),
1491 .nvquirks
= NVQUIRK_NEEDS_PAD_CONTROL
|
1492 NVQUIRK_HAS_PADCALIB
|
1493 NVQUIRK_DIS_CARD_CLK_CONFIG_TAP
|
1494 NVQUIRK_ENABLE_SDR50
|
1495 NVQUIRK_ENABLE_SDR104
|
1497 .min_tap_delay
= 96,
1498 .max_tap_delay
= 139,
1501 static const struct of_device_id sdhci_tegra_dt_match
[] = {
1502 { .compatible
= "nvidia,tegra194-sdhci", .data
= &soc_data_tegra194
},
1503 { .compatible
= "nvidia,tegra186-sdhci", .data
= &soc_data_tegra186
},
1504 { .compatible
= "nvidia,tegra210-sdhci", .data
= &soc_data_tegra210
},
1505 { .compatible
= "nvidia,tegra124-sdhci", .data
= &soc_data_tegra124
},
1506 { .compatible
= "nvidia,tegra114-sdhci", .data
= &soc_data_tegra114
},
1507 { .compatible
= "nvidia,tegra30-sdhci", .data
= &soc_data_tegra30
},
1508 { .compatible
= "nvidia,tegra20-sdhci", .data
= &soc_data_tegra20
},
1511 MODULE_DEVICE_TABLE(of
, sdhci_tegra_dt_match
);
1513 static int sdhci_tegra_add_host(struct sdhci_host
*host
)
1515 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
1516 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
1517 struct cqhci_host
*cq_host
;
1521 if (!tegra_host
->enable_hwcq
)
1522 return sdhci_add_host(host
);
1524 sdhci_enable_v4_mode(host
);
1526 ret
= sdhci_setup_host(host
);
1530 host
->mmc
->caps2
|= MMC_CAP2_CQE
| MMC_CAP2_CQE_DCMD
;
1532 cq_host
= devm_kzalloc(host
->mmc
->parent
,
1533 sizeof(*cq_host
), GFP_KERNEL
);
1539 cq_host
->mmio
= host
->ioaddr
+ SDHCI_TEGRA_CQE_BASE_ADDR
;
1540 cq_host
->ops
= &sdhci_tegra_cqhci_ops
;
1542 dma64
= host
->flags
& SDHCI_USE_64_BIT_DMA
;
1544 cq_host
->caps
|= CQHCI_TASK_DESC_SZ_128
;
1546 ret
= cqhci_init(cq_host
, host
->mmc
, dma64
);
1550 ret
= __sdhci_add_host(host
);
1557 sdhci_cleanup_host(host
);
1561 static int sdhci_tegra_probe(struct platform_device
*pdev
)
1563 const struct of_device_id
*match
;
1564 const struct sdhci_tegra_soc_data
*soc_data
;
1565 struct sdhci_host
*host
;
1566 struct sdhci_pltfm_host
*pltfm_host
;
1567 struct sdhci_tegra
*tegra_host
;
1571 match
= of_match_device(sdhci_tegra_dt_match
, &pdev
->dev
);
1574 soc_data
= match
->data
;
1576 host
= sdhci_pltfm_init(pdev
, soc_data
->pdata
, sizeof(*tegra_host
));
1578 return PTR_ERR(host
);
1579 pltfm_host
= sdhci_priv(host
);
1581 tegra_host
= sdhci_pltfm_priv(pltfm_host
);
1582 tegra_host
->ddr_signaling
= false;
1583 tegra_host
->pad_calib_required
= false;
1584 tegra_host
->pad_control_available
= false;
1585 tegra_host
->soc_data
= soc_data
;
1587 if (soc_data
->nvquirks
& NVQUIRK_NEEDS_PAD_CONTROL
) {
1588 rc
= tegra_sdhci_init_pinctrl_info(&pdev
->dev
, tegra_host
);
1590 host
->mmc_host_ops
.start_signal_voltage_switch
=
1591 sdhci_tegra_start_signal_voltage_switch
;
1594 /* Hook to periodically rerun pad calibration */
1595 if (soc_data
->nvquirks
& NVQUIRK_HAS_PADCALIB
)
1596 host
->mmc_host_ops
.request
= tegra_sdhci_request
;
1598 host
->mmc_host_ops
.hs400_enhanced_strobe
=
1599 tegra_sdhci_hs400_enhanced_strobe
;
1601 if (!host
->ops
->platform_execute_tuning
)
1602 host
->mmc_host_ops
.execute_tuning
=
1603 tegra_sdhci_execute_hw_tuning
;
1605 rc
= mmc_of_parse(host
->mmc
);
1609 if (tegra_host
->soc_data
->nvquirks
& NVQUIRK_ENABLE_DDR50
)
1610 host
->mmc
->caps
|= MMC_CAP_1_8V_DDR
;
1612 /* HW busy detection is supported, but R1B responses are required. */
1613 host
->mmc
->caps
|= MMC_CAP_WAIT_WHILE_BUSY
| MMC_CAP_NEED_RSP_BUSY
;
1615 tegra_sdhci_parse_dt(host
);
1617 tegra_host
->power_gpio
= devm_gpiod_get_optional(&pdev
->dev
, "power",
1619 if (IS_ERR(tegra_host
->power_gpio
)) {
1620 rc
= PTR_ERR(tegra_host
->power_gpio
);
1625 * Tegra210 has a separate SDMMC_LEGACY_TM clock used for host
1626 * timeout clock and SW can choose TMCLK or SDCLK for hardware
1627 * data timeout through the bit USE_TMCLK_FOR_DATA_TIMEOUT of
1628 * the register SDHCI_TEGRA_VENDOR_SYS_SW_CTRL.
1630 * USE_TMCLK_FOR_DATA_TIMEOUT bit default is set to 1 and SDMMC uses
1631 * 12Mhz TMCLK which is advertised in host capability register.
1632 * With TMCLK of 12Mhz provides maximum data timeout period that can
1633 * be achieved is 11s better than using SDCLK for data timeout.
1635 * So, TMCLK is set to 12Mhz and kept enabled all the time on SoC's
1636 * supporting separate TMCLK.
1639 if (soc_data
->nvquirks
& NVQUIRK_HAS_TMCLK
) {
1640 clk
= devm_clk_get(&pdev
->dev
, "tmclk");
1643 if (rc
== -EPROBE_DEFER
)
1646 dev_warn(&pdev
->dev
, "failed to get tmclk: %d\n", rc
);
1650 clk_set_rate(clk
, 12000000);
1651 rc
= clk_prepare_enable(clk
);
1654 "failed to enable tmclk: %d\n", rc
);
1658 tegra_host
->tmclk
= clk
;
1661 clk
= devm_clk_get(mmc_dev(host
->mmc
), NULL
);
1663 rc
= dev_err_probe(&pdev
->dev
, PTR_ERR(clk
),
1664 "failed to get clock\n");
1667 clk_prepare_enable(clk
);
1668 pltfm_host
->clk
= clk
;
1670 tegra_host
->rst
= devm_reset_control_get_exclusive(&pdev
->dev
,
1672 if (IS_ERR(tegra_host
->rst
)) {
1673 rc
= PTR_ERR(tegra_host
->rst
);
1674 dev_err(&pdev
->dev
, "failed to get reset control: %d\n", rc
);
1678 rc
= reset_control_assert(tegra_host
->rst
);
1682 usleep_range(2000, 4000);
1684 rc
= reset_control_deassert(tegra_host
->rst
);
1688 usleep_range(2000, 4000);
1690 rc
= sdhci_tegra_add_host(host
);
1697 reset_control_assert(tegra_host
->rst
);
1699 clk_disable_unprepare(pltfm_host
->clk
);
1701 clk_disable_unprepare(tegra_host
->tmclk
);
1704 sdhci_pltfm_free(pdev
);
1708 static int sdhci_tegra_remove(struct platform_device
*pdev
)
1710 struct sdhci_host
*host
= platform_get_drvdata(pdev
);
1711 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
1712 struct sdhci_tegra
*tegra_host
= sdhci_pltfm_priv(pltfm_host
);
1714 sdhci_remove_host(host
, 0);
1716 reset_control_assert(tegra_host
->rst
);
1717 usleep_range(2000, 4000);
1718 clk_disable_unprepare(pltfm_host
->clk
);
1719 clk_disable_unprepare(tegra_host
->tmclk
);
1721 sdhci_pltfm_free(pdev
);
1726 #ifdef CONFIG_PM_SLEEP
1727 static int __maybe_unused
sdhci_tegra_suspend(struct device
*dev
)
1729 struct sdhci_host
*host
= dev_get_drvdata(dev
);
1730 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
1733 if (host
->mmc
->caps2
& MMC_CAP2_CQE
) {
1734 ret
= cqhci_suspend(host
->mmc
);
1739 ret
= sdhci_suspend_host(host
);
1741 cqhci_resume(host
->mmc
);
1745 clk_disable_unprepare(pltfm_host
->clk
);
1749 static int __maybe_unused
sdhci_tegra_resume(struct device
*dev
)
1751 struct sdhci_host
*host
= dev_get_drvdata(dev
);
1752 struct sdhci_pltfm_host
*pltfm_host
= sdhci_priv(host
);
1755 ret
= clk_prepare_enable(pltfm_host
->clk
);
1759 ret
= sdhci_resume_host(host
);
1763 if (host
->mmc
->caps2
& MMC_CAP2_CQE
) {
1764 ret
= cqhci_resume(host
->mmc
);
1772 sdhci_suspend_host(host
);
1774 clk_disable_unprepare(pltfm_host
->clk
);
1779 static SIMPLE_DEV_PM_OPS(sdhci_tegra_dev_pm_ops
, sdhci_tegra_suspend
,
1780 sdhci_tegra_resume
);
1782 static struct platform_driver sdhci_tegra_driver
= {
1784 .name
= "sdhci-tegra",
1785 .probe_type
= PROBE_PREFER_ASYNCHRONOUS
,
1786 .of_match_table
= sdhci_tegra_dt_match
,
1787 .pm
= &sdhci_tegra_dev_pm_ops
,
1789 .probe
= sdhci_tegra_probe
,
1790 .remove
= sdhci_tegra_remove
,
1793 module_platform_driver(sdhci_tegra_driver
);
1795 MODULE_DESCRIPTION("SDHCI driver for Tegra");
1796 MODULE_AUTHOR("Google, Inc.");
1797 MODULE_LICENSE("GPL v2");