.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * Exynos Specific Extensions for Synopsys DW Multimedia Card Interface driver |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) 2012, Samsung Electronics Co., Ltd. |
---|
5 | | - * |
---|
6 | | - * This program is free software; you can redistribute it and/or modify |
---|
7 | | - * it under the terms of the GNU General Public License as published by |
---|
8 | | - * the Free Software Foundation; either version 2 of the License, or |
---|
9 | | - * (at your option) any later version. |
---|
10 | 6 | */ |
---|
11 | 7 | |
---|
12 | 8 | #include <linux/module.h> |
---|
.. | .. |
---|
180 | 176 | #ifdef CONFIG_PM_SLEEP |
---|
181 | 177 | /** |
---|
182 | 178 | * dw_mci_exynos_suspend_noirq - Exynos-specific suspend code |
---|
| 179 | + * @dev: Device to suspend (this device) |
---|
183 | 180 | * |
---|
184 | 181 | * This ensures that device will be in runtime active state in |
---|
185 | 182 | * dw_mci_exynos_resume_noirq after calling pm_runtime_force_resume() |
---|
.. | .. |
---|
192 | 189 | |
---|
193 | 190 | /** |
---|
194 | 191 | * dw_mci_exynos_resume_noirq - Exynos-specific resume code |
---|
| 192 | + * @dev: Device to resume (this device) |
---|
195 | 193 | * |
---|
196 | 194 | * On exynos5420 there is a silicon errata that will sometimes leave the |
---|
197 | 195 | * WAKEUP_INT bit in the CLKSEL register asserted. This bit is 1 to indicate |
---|
.. | .. |
---|
253 | 251 | if (timing == MMC_TIMING_MMC_HS400) { |
---|
254 | 252 | dqs |= DATA_STROBE_EN; |
---|
255 | 253 | strobe = DQS_CTRL_RD_DELAY(strobe, priv->dqs_delay); |
---|
| 254 | + } else if (timing == MMC_TIMING_UHS_SDR104) { |
---|
| 255 | + dqs &= 0xffffff00; |
---|
256 | 256 | } else { |
---|
257 | 257 | dqs &= ~DATA_STROBE_EN; |
---|
258 | 258 | } |
---|
.. | .. |
---|
311 | 311 | /* Should be double rate for DDR mode */ |
---|
312 | 312 | if (ios->bus_width == MMC_BUS_WIDTH_8) |
---|
313 | 313 | wanted <<= 1; |
---|
| 314 | + break; |
---|
| 315 | + case MMC_TIMING_UHS_SDR104: |
---|
| 316 | + case MMC_TIMING_UHS_SDR50: |
---|
| 317 | + clksel = (priv->sdr_timing & 0xfff8ffff) | |
---|
| 318 | + (priv->ciu_div << 16); |
---|
| 319 | + break; |
---|
| 320 | + case MMC_TIMING_UHS_DDR50: |
---|
| 321 | + clksel = (priv->ddr_timing & 0xfff8ffff) | |
---|
| 322 | + (priv->ciu_div << 16); |
---|
314 | 323 | break; |
---|
315 | 324 | default: |
---|
316 | 325 | clksel = priv->sdr_timing; |
---|
.. | .. |
---|
477 | 486 | struct dw_mci_exynos_priv_data *priv = host->priv; |
---|
478 | 487 | struct mmc_host *mmc = slot->mmc; |
---|
479 | 488 | u8 start_smpl, smpl, candiates = 0; |
---|
480 | | - s8 found = -1; |
---|
| 489 | + s8 found; |
---|
481 | 490 | int ret = 0; |
---|
482 | 491 | |
---|
483 | 492 | start_smpl = dw_mci_exynos_get_clksmpl(host); |
---|
.. | .. |
---|
597 | 606 | .remove = dw_mci_exynos_remove, |
---|
598 | 607 | .driver = { |
---|
599 | 608 | .name = "dwmmc_exynos", |
---|
| 609 | + .probe_type = PROBE_PREFER_ASYNCHRONOUS, |
---|
600 | 610 | .of_match_table = dw_mci_exynos_match, |
---|
601 | 611 | .pm = &dw_mci_exynos_pmops, |
---|
602 | 612 | }, |
---|