Linux Audio

Check our new training course

Loading...
v3.15
 
  1/*
  2 * Copyright (C) 2010 Google, Inc.
  3 *
  4 * This software is licensed under the terms of the GNU General Public
  5 * License version 2, as published by the Free Software Foundation, and
  6 * may be copied, distributed, and modified under those terms.
  7 *
  8 * This program is distributed in the hope that it will be useful,
  9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 11 * GNU General Public License for more details.
 12 *
 13 */
 14
 
 
 15#include <linux/err.h>
 16#include <linux/module.h>
 17#include <linux/init.h>
 
 18#include <linux/platform_device.h>
 19#include <linux/clk.h>
 20#include <linux/io.h>
 21#include <linux/of.h>
 22#include <linux/of_device.h>
 23#include <linux/of_gpio.h>
 24#include <linux/gpio.h>
 
 25#include <linux/mmc/card.h>
 26#include <linux/mmc/host.h>
 
 27#include <linux/mmc/slot-gpio.h>
 28
 29#include <asm/gpio.h>
 30
 31#include "sdhci-pltfm.h"
 
 32
 33/* Tegra SDHOST controller vendor register definitions */
 34#define SDHCI_TEGRA_VENDOR_MISC_CTRL		0x120
 35#define SDHCI_MISC_CTRL_ENABLE_SDHCI_SPEC_300	0x20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 36
 37#define NVQUIRK_FORCE_SDHCI_SPEC_200	BIT(0)
 38#define NVQUIRK_ENABLE_BLOCK_GAP_DET	BIT(1)
 39#define NVQUIRK_ENABLE_SDHCI_SPEC_300	BIT(2)
 
 
 
 
 
 40
 41struct sdhci_tegra_soc_data {
 42	const struct sdhci_pltfm_data *pdata;
 
 43	u32 nvquirks;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 44};
 45
 46struct sdhci_tegra {
 47	const struct sdhci_tegra_soc_data *soc_data;
 48	int power_gpio;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 49};
 50
 51static u32 tegra_sdhci_readl(struct sdhci_host *host, int reg)
 52{
 53	u32 val;
 54
 55	if (unlikely(reg == SDHCI_PRESENT_STATE)) {
 56		/* Use wp_gpio here instead? */
 57		val = readl(host->ioaddr + reg);
 58		return val | SDHCI_WRITE_PROTECT;
 59	}
 60
 61	return readl(host->ioaddr + reg);
 62}
 63
 64static u16 tegra_sdhci_readw(struct sdhci_host *host, int reg)
 65{
 66	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
 67	struct sdhci_tegra *tegra_host = pltfm_host->priv;
 68	const struct sdhci_tegra_soc_data *soc_data = tegra_host->soc_data;
 69
 70	if (unlikely((soc_data->nvquirks & NVQUIRK_FORCE_SDHCI_SPEC_200) &&
 71			(reg == SDHCI_HOST_VERSION))) {
 72		/* Erratum: Version register is invalid in HW. */
 73		return SDHCI_SPEC_200;
 74	}
 75
 76	return readw(host->ioaddr + reg);
 77}
 78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 79static void tegra_sdhci_writel(struct sdhci_host *host, u32 val, int reg)
 80{
 81	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
 82	struct sdhci_tegra *tegra_host = pltfm_host->priv;
 83	const struct sdhci_tegra_soc_data *soc_data = tegra_host->soc_data;
 84
 85	/* Seems like we're getting spurious timeout and crc errors, so
 86	 * disable signalling of them. In case of real errors software
 87	 * timers should take care of eventually detecting them.
 88	 */
 89	if (unlikely(reg == SDHCI_SIGNAL_ENABLE))
 90		val &= ~(SDHCI_INT_TIMEOUT|SDHCI_INT_CRC);
 91
 92	writel(val, host->ioaddr + reg);
 93
 94	if (unlikely((soc_data->nvquirks & NVQUIRK_ENABLE_BLOCK_GAP_DET) &&
 95			(reg == SDHCI_INT_ENABLE))) {
 96		/* Erratum: Must enable block gap interrupt detection */
 97		u8 gap_ctrl = readb(host->ioaddr + SDHCI_BLOCK_GAP_CONTROL);
 98		if (val & SDHCI_INT_CARD_INT)
 99			gap_ctrl |= 0x8;
100		else
101			gap_ctrl &= ~0x8;
102		writeb(gap_ctrl, host->ioaddr + SDHCI_BLOCK_GAP_CONTROL);
103	}
104}
105
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106static unsigned int tegra_sdhci_get_ro(struct sdhci_host *host)
107{
 
 
 
 
 
108	return mmc_gpio_get_ro(host->mmc);
109}
110
111static void tegra_sdhci_reset_exit(struct sdhci_host *host, u8 mask)
112{
113	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
114	struct sdhci_tegra *tegra_host = pltfm_host->priv;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115	const struct sdhci_tegra_soc_data *soc_data = tegra_host->soc_data;
 
 
 
116
117	if (!(mask & SDHCI_RESET_ALL))
118		return;
119
120	/* Erratum: Enable SDHCI spec v3.00 support */
121	if (soc_data->nvquirks & NVQUIRK_ENABLE_SDHCI_SPEC_300) {
122		u32 misc_ctrl;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
124		misc_ctrl = sdhci_readb(host, SDHCI_TEGRA_VENDOR_MISC_CTRL);
125		misc_ctrl |= SDHCI_MISC_CTRL_ENABLE_SDHCI_SPEC_300;
126		sdhci_writeb(host, misc_ctrl, SDHCI_TEGRA_VENDOR_MISC_CTRL);
 
 
 
 
127	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128}
129
130static int tegra_sdhci_buswidth(struct sdhci_host *host, int bus_width)
 
131{
132	u32 ctrl;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
134	ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
135	if ((host->mmc->caps & MMC_CAP_8_BIT_DATA) &&
136	    (bus_width == MMC_BUS_WIDTH_8)) {
137		ctrl &= ~SDHCI_CTRL_4BITBUS;
138		ctrl |= SDHCI_CTRL_8BITBUS;
139	} else {
140		ctrl &= ~SDHCI_CTRL_8BITBUS;
141		if (bus_width == MMC_BUS_WIDTH_4)
142			ctrl |= SDHCI_CTRL_4BITBUS;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143		else
144			ctrl &= ~SDHCI_CTRL_4BITBUS;
145	}
146	sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147	return 0;
148}
149
150static const struct sdhci_ops tegra_sdhci_ops = {
151	.get_ro     = tegra_sdhci_get_ro,
152	.read_l     = tegra_sdhci_readl,
153	.read_w     = tegra_sdhci_readw,
154	.write_l    = tegra_sdhci_writel,
155	.platform_bus_width = tegra_sdhci_buswidth,
156	.platform_reset_exit = tegra_sdhci_reset_exit,
 
 
 
 
 
 
157};
158
159static const struct sdhci_pltfm_data sdhci_tegra20_pdata = {
160	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
161		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
162		  SDHCI_QUIRK_NO_HISPD_BIT |
163		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC,
 
164	.ops  = &tegra_sdhci_ops,
165};
166
167static struct sdhci_tegra_soc_data soc_data_tegra20 = {
168	.pdata = &sdhci_tegra20_pdata,
 
169	.nvquirks = NVQUIRK_FORCE_SDHCI_SPEC_200 |
170		    NVQUIRK_ENABLE_BLOCK_GAP_DET,
171};
172
173static const struct sdhci_pltfm_data sdhci_tegra30_pdata = {
174	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
175		  SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
176		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
177		  SDHCI_QUIRK_NO_HISPD_BIT |
178		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC,
 
 
 
 
 
 
 
 
 
 
 
179	.ops  = &tegra_sdhci_ops,
180};
181
182static struct sdhci_tegra_soc_data soc_data_tegra30 = {
183	.pdata = &sdhci_tegra30_pdata,
184	.nvquirks = NVQUIRK_ENABLE_SDHCI_SPEC_300,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185};
186
187static const struct sdhci_pltfm_data sdhci_tegra114_pdata = {
188	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
189		  SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
190		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
191		  SDHCI_QUIRK_NO_HISPD_BIT |
192		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC,
193	.ops  = &tegra_sdhci_ops,
 
 
194};
195
196static struct sdhci_tegra_soc_data soc_data_tegra114 = {
197	.pdata = &sdhci_tegra114_pdata,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198};
199
200static const struct of_device_id sdhci_tegra_dt_match[] = {
201	{ .compatible = "nvidia,tegra124-sdhci", .data = &soc_data_tegra114 },
 
 
 
202	{ .compatible = "nvidia,tegra114-sdhci", .data = &soc_data_tegra114 },
203	{ .compatible = "nvidia,tegra30-sdhci", .data = &soc_data_tegra30 },
204	{ .compatible = "nvidia,tegra20-sdhci", .data = &soc_data_tegra20 },
205	{}
206};
207MODULE_DEVICE_TABLE(of, sdhci_tegra_dt_match);
208
209static int sdhci_tegra_parse_dt(struct device *dev)
210{
211	struct device_node *np = dev->of_node;
212	struct sdhci_host *host = dev_get_drvdata(dev);
213	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
214	struct sdhci_tegra *tegra_host = pltfm_host->priv;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215
216	tegra_host->power_gpio = of_get_named_gpio(np, "power-gpios", 0);
217	return mmc_of_parse(host->mmc);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218}
219
220static int sdhci_tegra_probe(struct platform_device *pdev)
221{
222	const struct of_device_id *match;
223	const struct sdhci_tegra_soc_data *soc_data;
224	struct sdhci_host *host;
225	struct sdhci_pltfm_host *pltfm_host;
226	struct sdhci_tegra *tegra_host;
227	struct clk *clk;
228	int rc;
229
230	match = of_match_device(sdhci_tegra_dt_match, &pdev->dev);
231	if (!match)
232		return -EINVAL;
233	soc_data = match->data;
234
235	host = sdhci_pltfm_init(pdev, soc_data->pdata, 0);
236	if (IS_ERR(host))
237		return PTR_ERR(host);
238	pltfm_host = sdhci_priv(host);
239
240	tegra_host = devm_kzalloc(&pdev->dev, sizeof(*tegra_host), GFP_KERNEL);
241	if (!tegra_host) {
242		dev_err(mmc_dev(host->mmc), "failed to allocate tegra_host\n");
243		rc = -ENOMEM;
244		goto err_alloc_tegra_host;
245	}
246	tegra_host->soc_data = soc_data;
247	pltfm_host->priv = tegra_host;
248
249	rc = sdhci_tegra_parse_dt(&pdev->dev);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250	if (rc)
251		goto err_parse_dt;
252
253	if (gpio_is_valid(tegra_host->power_gpio)) {
254		rc = gpio_request(tegra_host->power_gpio, "sdhci_power");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
255		if (rc) {
256			dev_err(mmc_dev(host->mmc),
257				"failed to allocate power gpio\n");
258			goto err_power_req;
259		}
260		gpio_direction_output(tegra_host->power_gpio, 1);
 
261	}
262
263	clk = clk_get(mmc_dev(host->mmc), NULL);
264	if (IS_ERR(clk)) {
265		dev_err(mmc_dev(host->mmc), "clk err\n");
266		rc = PTR_ERR(clk);
 
 
 
 
267		goto err_clk_get;
268	}
269	clk_prepare_enable(clk);
270	pltfm_host->clk = clk;
271
272	rc = sdhci_add_host(host);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
273	if (rc)
274		goto err_add_host;
275
276	return 0;
277
278err_add_host:
 
 
279	clk_disable_unprepare(pltfm_host->clk);
280	clk_put(pltfm_host->clk);
281err_clk_get:
282	if (gpio_is_valid(tegra_host->power_gpio))
283		gpio_free(tegra_host->power_gpio);
284err_power_req:
285err_parse_dt:
286err_alloc_tegra_host:
287	sdhci_pltfm_free(pdev);
288	return rc;
289}
290
291static int sdhci_tegra_remove(struct platform_device *pdev)
292{
293	struct sdhci_host *host = platform_get_drvdata(pdev);
294	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
295	struct sdhci_tegra *tegra_host = pltfm_host->priv;
296	int dead = (readl(host->ioaddr + SDHCI_INT_STATUS) == 0xffffffff);
297
298	sdhci_remove_host(host, dead);
299
300	if (gpio_is_valid(tegra_host->power_gpio))
301		gpio_free(tegra_host->power_gpio);
302
 
 
303	clk_disable_unprepare(pltfm_host->clk);
304	clk_put(pltfm_host->clk);
305
306	sdhci_pltfm_free(pdev);
307
308	return 0;
309}
310
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
311static struct platform_driver sdhci_tegra_driver = {
312	.driver		= {
313		.name	= "sdhci-tegra",
314		.owner	= THIS_MODULE,
315		.of_match_table = sdhci_tegra_dt_match,
316		.pm	= SDHCI_PLTFM_PMOPS,
317	},
318	.probe		= sdhci_tegra_probe,
319	.remove		= sdhci_tegra_remove,
320};
321
322module_platform_driver(sdhci_tegra_driver);
323
324MODULE_DESCRIPTION("SDHCI driver for Tegra");
325MODULE_AUTHOR("Google, Inc.");
326MODULE_LICENSE("GPL v2");
v5.9
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (C) 2010 Google, Inc.
 
 
 
 
 
 
 
 
 
 
   4 */
   5
   6#include <linux/delay.h>
   7#include <linux/dma-mapping.h>
   8#include <linux/err.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>
  14#include <linux/io.h>
  15#include <linux/of.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>
  26
  27#include "sdhci-pltfm.h"
  28#include "cqhci.h"
  29
  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)
  39
  40#define SDHCI_TEGRA_VENDOR_SYS_SW_CTRL			0x104
  41#define SDHCI_TEGRA_SYS_SW_CTRL_ENHANCED_STROBE		BIT(31)
  42
  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
  46
  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
  53
  54#define SDHCI_TEGRA_VENDOR_DLLCAL_CFG			0x1b0
  55#define SDHCI_TEGRA_DLLCAL_CALIBRATE			BIT(31)
  56
  57#define SDHCI_TEGRA_VENDOR_DLLCAL_STA			0x1bc
  58#define SDHCI_TEGRA_DLLCAL_STA_ACTIVE			BIT(31)
  59
  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
  68#define TRIES_128					2
  69#define TRIES_256					4
  70#define SDHCI_VNDR_TUN_CTRL0_TUN_WORD_SEL_MASK		0x7
  71
  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
  78
  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
  83
  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
  89
  90#define SDHCI_TEGRA_AUTO_CAL_STATUS			0x1ec
  91#define SDHCI_TEGRA_AUTO_CAL_ACTIVE			BIT(31)
  92
  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)
  99/*
 100 * HAS_PADCALIB NVQUIRK is for SoC's supporting auto calibration of pads
 101 * drive strength.
 102 */
 103#define NVQUIRK_HAS_PADCALIB				BIT(6)
 104/*
 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.
 108 */
 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)
 112
 113/*
 114 * NVQUIRK_HAS_TMCLK is for SoC's having separate timeout clock for Tegra
 115 * SDMMC hardware data timeout.
 116 */
 117#define NVQUIRK_HAS_TMCLK				BIT(10)
 118
 119/* SDMMC CQE Base Address for Tegra Host Ver 4.1 and Higher */
 120#define SDHCI_TEGRA_CQE_BASE_ADDR			0xF000
 121
 122struct sdhci_tegra_soc_data {
 123	const struct sdhci_pltfm_data *pdata;
 124	u64 dma_mask;
 125	u32 nvquirks;
 126	u8 min_tap_delay;
 127	u8 max_tap_delay;
 128};
 129
 130/* Magic pull up and pull down pad calibration offsets */
 131struct sdhci_tegra_autocal_offsets {
 132	u32 pull_up_3v3;
 133	u32 pull_down_3v3;
 134	u32 pull_up_3v3_timeout;
 135	u32 pull_down_3v3_timeout;
 136	u32 pull_up_1v8;
 137	u32 pull_down_1v8;
 138	u32 pull_up_1v8_timeout;
 139	u32 pull_down_1v8_timeout;
 140	u32 pull_up_sdr104;
 141	u32 pull_down_sdr104;
 142	u32 pull_up_hs400;
 143	u32 pull_down_hs400;
 144};
 145
 146struct sdhci_tegra {
 147	const struct sdhci_tegra_soc_data *soc_data;
 148	struct gpio_desc *power_gpio;
 149	struct clk *tmclk;
 150	bool ddr_signaling;
 151	bool pad_calib_required;
 152	bool pad_control_available;
 153
 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;
 160
 161	struct sdhci_tegra_autocal_offsets autocal_offsets;
 162	ktime_t last_calib;
 163
 164	u32 default_tap;
 165	u32 default_trim;
 166	u32 dqs_trim;
 167	bool enable_hwcq;
 168	unsigned long curr_clk_rate;
 169	u8 tuned_tap_delay;
 170};
 171
 
 
 
 
 
 
 
 
 
 
 
 
 
 172static u16 tegra_sdhci_readw(struct sdhci_host *host, int reg)
 173{
 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;
 177
 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;
 182	}
 183
 184	return readw(host->ioaddr + reg);
 185}
 186
 187static void tegra_sdhci_writew(struct sdhci_host *host, u16 val, int reg)
 188{
 189	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
 190
 191	switch (reg) {
 192	case SDHCI_TRANSFER_MODE:
 193		/*
 194		 * Postpone this write, we must do it together with a
 195		 * command write that is down below.
 196		 */
 197		pltfm_host->xfer_mode_shadow = val;
 198		return;
 199	case SDHCI_COMMAND:
 200		writel((val << 16) | pltfm_host->xfer_mode_shadow,
 201			host->ioaddr + SDHCI_TRANSFER_MODE);
 202		return;
 203	}
 204
 205	writew(val, host->ioaddr + reg);
 206}
 207
 208static void tegra_sdhci_writel(struct sdhci_host *host, u32 val, int reg)
 209{
 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;
 213
 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.
 217	 */
 218	if (unlikely(reg == SDHCI_SIGNAL_ENABLE))
 219		val &= ~(SDHCI_INT_TIMEOUT|SDHCI_INT_CRC);
 220
 221	writel(val, host->ioaddr + reg);
 222
 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)
 228			gap_ctrl |= 0x8;
 229		else
 230			gap_ctrl &= ~0x8;
 231		writeb(gap_ctrl, host->ioaddr + SDHCI_BLOCK_GAP_CONTROL);
 232	}
 233}
 234
 235static bool tegra_sdhci_configure_card_clk(struct sdhci_host *host, bool enable)
 236{
 237	bool status;
 238	u32 reg;
 239
 240	reg = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
 241	status = !!(reg & SDHCI_CLOCK_CARD_EN);
 242
 243	if (status == enable)
 244		return status;
 245
 246	if (enable)
 247		reg |= SDHCI_CLOCK_CARD_EN;
 248	else
 249		reg &= ~SDHCI_CLOCK_CARD_EN;
 250
 251	sdhci_writew(host, reg, SDHCI_CLOCK_CONTROL);
 252
 253	return status;
 254}
 255
 256static void tegra210_sdhci_writew(struct sdhci_host *host, u16 val, int reg)
 257{
 258	bool is_tuning_cmd = 0;
 259	bool clk_enabled;
 260	u8 cmd;
 261
 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;
 266	}
 267
 268	if (is_tuning_cmd)
 269		clk_enabled = tegra_sdhci_configure_card_clk(host, 0);
 270
 271	writew(val, host->ioaddr + reg);
 272
 273	if (is_tuning_cmd) {
 274		udelay(1);
 275		sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
 276		tegra_sdhci_configure_card_clk(host, clk_enabled);
 277	}
 278}
 279
 280static unsigned int tegra_sdhci_get_ro(struct sdhci_host *host)
 281{
 282	/*
 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
 285	 * Tegra.
 286	 */
 287	return mmc_gpio_get_ro(host->mmc);
 288}
 289
 290static bool tegra_sdhci_is_pad_and_regulator_valid(struct sdhci_host *host)
 291{
 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;
 295
 296	/*
 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.
 302	 */
 303
 304	if (!(tegra_host->soc_data->nvquirks & NVQUIRK_NEEDS_PAD_CONTROL))
 305		return true;
 306
 307	if (IS_ERR(host->mmc->supply.vqmmc))
 308		return false;
 309
 310	has_1v8 = regulator_is_supported_voltage(host->mmc->supply.vqmmc,
 311						 1700000, 1950000);
 312
 313	has_3v3 = regulator_is_supported_voltage(host->mmc->supply.vqmmc,
 314						 2700000, 3600000);
 315
 316	if (has_1v8 == 1 && has_3v3 == 1)
 317		return tegra_host->pad_control_available;
 318
 319	/* Fixed voltage, no pad control required. */
 320	return true;
 321}
 322
 323static void tegra_sdhci_set_tap(struct sdhci_host *host, unsigned int tap)
 324{
 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;
 329	u32 reg;
 330
 331	/*
 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.
 335	 */
 336
 337	if (soc_data->nvquirks & NVQUIRK_DIS_CARD_CLK_CONFIG_TAP)
 338		card_clk_enabled = tegra_sdhci_configure_card_clk(host, false);
 339
 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);
 344
 345	if (soc_data->nvquirks & NVQUIRK_DIS_CARD_CLK_CONFIG_TAP &&
 346	    card_clk_enabled) {
 347		udelay(1);
 348		sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
 349		tegra_sdhci_configure_card_clk(host, card_clk_enabled);
 350	}
 351}
 352
 353static void tegra_sdhci_hs400_enhanced_strobe(struct mmc_host *mmc,
 354					      struct mmc_ios *ios)
 355{
 356	struct sdhci_host *host = mmc_priv(mmc);
 357	u32 val;
 358
 359	val = sdhci_readl(host, SDHCI_TEGRA_VENDOR_SYS_SW_CTRL);
 360
 361	if (ios->enhanced_strobe)
 362		val |= SDHCI_TEGRA_SYS_SW_CTRL_ENHANCED_STROBE;
 363	else
 364		val &= ~SDHCI_TEGRA_SYS_SW_CTRL_ENHANCED_STROBE;
 365
 366	sdhci_writel(host, val, SDHCI_TEGRA_VENDOR_SYS_SW_CTRL);
 367
 368}
 369
 370static void tegra_sdhci_reset(struct sdhci_host *host, u8 mask)
 371{
 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;
 376
 377	sdhci_reset(host, mask);
 378
 379	if (!(mask & SDHCI_RESET_ALL))
 380		return;
 381
 382	tegra_sdhci_set_tap(host, tegra_host->default_tap);
 383
 384	misc_ctrl = sdhci_readl(host, SDHCI_TEGRA_VENDOR_MISC_CTRL);
 385	clk_ctrl = sdhci_readl(host, SDHCI_TEGRA_VENDOR_CLOCK_CTRL);
 386
 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);
 391
 392	clk_ctrl &= ~(SDHCI_CLOCK_CTRL_TRIM_MASK |
 393		      SDHCI_CLOCK_CTRL_SPI_MODE_CLKEN_OVERRIDE);
 394
 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;
 408	}
 409
 410	clk_ctrl |= tegra_host->default_trim << SDHCI_CLOCK_CTRL_TRIM_SHIFT;
 411
 412	sdhci_writel(host, misc_ctrl, SDHCI_TEGRA_VENDOR_MISC_CTRL);
 413	sdhci_writel(host, clk_ctrl, SDHCI_TEGRA_VENDOR_CLOCK_CTRL);
 414
 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);
 420
 421		tegra_host->pad_calib_required = true;
 422	}
 423
 424	tegra_host->ddr_signaling = false;
 425}
 426
 427static void tegra_sdhci_configure_cal_pad(struct sdhci_host *host, bool enable)
 428{
 429	u32 val;
 430
 431	/*
 432	 * Enable or disable the additional I/O pad used by the drive strength
 433	 * calibration process.
 434	 */
 435	val = sdhci_readl(host, SDHCI_TEGRA_SDMEM_COMP_PADCTRL);
 436
 437	if (enable)
 438		val |= SDHCI_TEGRA_SDMEM_COMP_PADCTRL_E_INPUT_E_PWRD;
 439	else
 440		val &= ~SDHCI_TEGRA_SDMEM_COMP_PADCTRL_E_INPUT_E_PWRD;
 441
 442	sdhci_writel(host, val, SDHCI_TEGRA_SDMEM_COMP_PADCTRL);
 443
 444	if (enable)
 445		usleep_range(1, 2);
 446}
 447
 448static void tegra_sdhci_set_pad_autocal_offset(struct sdhci_host *host,
 449					       u16 pdpu)
 450{
 451	u32 reg;
 452
 453	reg = sdhci_readl(host, SDHCI_TEGRA_AUTO_CAL_CONFIG);
 454	reg &= ~SDHCI_AUTO_CAL_PDPU_OFFSET_MASK;
 455	reg |= pdpu;
 456	sdhci_writel(host, reg, SDHCI_TEGRA_AUTO_CAL_CONFIG);
 457}
 458
 459static int tegra_sdhci_set_padctrl(struct sdhci_host *host, int voltage,
 460				   bool state_drvupdn)
 461{
 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;
 467	int ret = 0;
 468	u8 drvup = 0, drvdn = 0;
 469	u32 reg;
 470
 471	if (!state_drvupdn) {
 472		/* PADS Drive Strength */
 473		if (voltage == MMC_SIGNAL_VOLTAGE_180) {
 474			if (tegra_host->pinctrl_state_1v8_drv) {
 475				pinctrl_drvupdn =
 476					tegra_host->pinctrl_state_1v8_drv;
 477			} else {
 478				drvup = offsets->pull_up_1v8_timeout;
 479				drvdn = offsets->pull_down_1v8_timeout;
 480			}
 481		} else {
 482			if (tegra_host->pinctrl_state_3v3_drv) {
 483				pinctrl_drvupdn =
 484					tegra_host->pinctrl_state_3v3_drv;
 485			} else {
 486				drvup = offsets->pull_up_3v3_timeout;
 487				drvdn = offsets->pull_down_3v3_timeout;
 488			}
 489		}
 490
 491		if (pinctrl_drvupdn != NULL) {
 492			ret = pinctrl_select_state(tegra_host->pinctrl_sdmmc,
 493							pinctrl_drvupdn);
 494			if (ret < 0)
 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);
 504		}
 505
 
 
 
 
 
 506	} else {
 507		/* Dual Voltage PADS Voltage selection */
 508		if (!tegra_host->pad_control_available)
 509			return 0;
 510
 511		if (voltage == MMC_SIGNAL_VOLTAGE_180) {
 512			ret = pinctrl_select_state(tegra_host->pinctrl_sdmmc,
 513						tegra_host->pinctrl_state_1v8);
 514			if (ret < 0)
 515				dev_err(mmc_dev(host->mmc),
 516					"setting 1.8V failed, ret: %d\n", ret);
 517		} else {
 518			ret = pinctrl_select_state(tegra_host->pinctrl_sdmmc,
 519						tegra_host->pinctrl_state_3v3);
 520			if (ret < 0)
 521				dev_err(mmc_dev(host->mmc),
 522					"setting 3.3V failed, ret: %d\n", ret);
 523		}
 524	}
 525
 526	return ret;
 527}
 528
 529static void tegra_sdhci_pad_autocalib(struct sdhci_host *host)
 530{
 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;
 537	u16 pdpu;
 538	u32 reg;
 539	int ret;
 540
 541	switch (ios->timing) {
 542	case MMC_TIMING_UHS_SDR104:
 543		pdpu = offsets.pull_down_sdr104 << 8 | offsets.pull_up_sdr104;
 544		break;
 545	case MMC_TIMING_MMC_HS400:
 546		pdpu = offsets.pull_down_hs400 << 8 | offsets.pull_up_hs400;
 547		break;
 548	default:
 549		if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_180)
 550			pdpu = offsets.pull_down_1v8 << 8 | offsets.pull_up_1v8;
 551		else
 552			pdpu = offsets.pull_down_3v3 << 8 | offsets.pull_up_3v3;
 553	}
 554
 555	/* Set initial offset before auto-calibration */
 556	tegra_sdhci_set_pad_autocal_offset(host, pdpu);
 557
 558	card_clk_enabled = tegra_sdhci_configure_card_clk(host, false);
 559
 560	tegra_sdhci_configure_cal_pad(host, true);
 561
 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);
 565
 566	usleep_range(1, 2);
 567	/* 10 ms timeout */
 568	ret = readl_poll_timeout(host->ioaddr + SDHCI_TEGRA_AUTO_CAL_STATUS,
 569				 reg, !(reg & SDHCI_TEGRA_AUTO_CAL_ACTIVE),
 570				 1000, 10000);
 571
 572	tegra_sdhci_configure_cal_pad(host, false);
 573
 574	tegra_sdhci_configure_card_clk(host, card_clk_enabled);
 575
 576	if (ret) {
 577		dev_err(mmc_dev(host->mmc), "Pad autocal timed out\n");
 578
 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);
 583
 584		ret = tegra_sdhci_set_padctrl(host, ios->signal_voltage, false);
 585		if (ret < 0)
 586			dev_err(mmc_dev(host->mmc),
 587				"Setting drive strengths failed: %d\n", ret);
 588	}
 589}
 590
 591static void tegra_sdhci_parse_pad_autocal_dt(struct sdhci_host *host)
 592{
 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;
 597	int err;
 598
 599	err = device_property_read_u32(host->mmc->parent,
 600			"nvidia,pad-autocal-pull-up-offset-3v3",
 601			&autocal->pull_up_3v3);
 602	if (err)
 603		autocal->pull_up_3v3 = 0;
 604
 605	err = device_property_read_u32(host->mmc->parent,
 606			"nvidia,pad-autocal-pull-down-offset-3v3",
 607			&autocal->pull_down_3v3);
 608	if (err)
 609		autocal->pull_down_3v3 = 0;
 610
 611	err = device_property_read_u32(host->mmc->parent,
 612			"nvidia,pad-autocal-pull-up-offset-1v8",
 613			&autocal->pull_up_1v8);
 614	if (err)
 615		autocal->pull_up_1v8 = 0;
 616
 617	err = device_property_read_u32(host->mmc->parent,
 618			"nvidia,pad-autocal-pull-down-offset-1v8",
 619			&autocal->pull_down_1v8);
 620	if (err)
 621		autocal->pull_down_1v8 = 0;
 622
 623	err = device_property_read_u32(host->mmc->parent,
 624			"nvidia,pad-autocal-pull-up-offset-sdr104",
 625			&autocal->pull_up_sdr104);
 626	if (err)
 627		autocal->pull_up_sdr104 = autocal->pull_up_1v8;
 628
 629	err = device_property_read_u32(host->mmc->parent,
 630			"nvidia,pad-autocal-pull-down-offset-sdr104",
 631			&autocal->pull_down_sdr104);
 632	if (err)
 633		autocal->pull_down_sdr104 = autocal->pull_down_1v8;
 634
 635	err = device_property_read_u32(host->mmc->parent,
 636			"nvidia,pad-autocal-pull-up-offset-hs400",
 637			&autocal->pull_up_hs400);
 638	if (err)
 639		autocal->pull_up_hs400 = autocal->pull_up_1v8;
 640
 641	err = device_property_read_u32(host->mmc->parent,
 642			"nvidia,pad-autocal-pull-down-offset-hs400",
 643			&autocal->pull_down_hs400);
 644	if (err)
 645		autocal->pull_down_hs400 = autocal->pull_down_1v8;
 646
 647	/*
 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.
 652	 */
 653	if (!(tegra_host->soc_data->nvquirks & NVQUIRK_NEEDS_PAD_CONTROL))
 654		return;
 655
 656	err = device_property_read_u32(host->mmc->parent,
 657			"nvidia,pad-autocal-pull-up-offset-3v3-timeout",
 658			&autocal->pull_up_3v3_timeout);
 659	if (err) {
 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;
 665	}
 666
 667	err = device_property_read_u32(host->mmc->parent,
 668			"nvidia,pad-autocal-pull-down-offset-3v3-timeout",
 669			&autocal->pull_down_3v3_timeout);
 670	if (err) {
 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;
 676	}
 677
 678	err = device_property_read_u32(host->mmc->parent,
 679			"nvidia,pad-autocal-pull-up-offset-1v8-timeout",
 680			&autocal->pull_up_1v8_timeout);
 681	if (err) {
 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;
 687	}
 688
 689	err = device_property_read_u32(host->mmc->parent,
 690			"nvidia,pad-autocal-pull-down-offset-1v8-timeout",
 691			&autocal->pull_down_1v8_timeout);
 692	if (err) {
 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;
 698	}
 699}
 700
 701static void tegra_sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
 702{
 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);
 707
 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();
 712	}
 713
 714	sdhci_request(mmc, mrq);
 715}
 716
 717static void tegra_sdhci_parse_tap_and_trim(struct sdhci_host *host)
 718{
 719	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
 720	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
 721	int err;
 722
 723	err = device_property_read_u32(host->mmc->parent, "nvidia,default-tap",
 724				       &tegra_host->default_tap);
 725	if (err)
 726		tegra_host->default_tap = 0;
 727
 728	err = device_property_read_u32(host->mmc->parent, "nvidia,default-trim",
 729				       &tegra_host->default_trim);
 730	if (err)
 731		tegra_host->default_trim = 0;
 732
 733	err = device_property_read_u32(host->mmc->parent, "nvidia,dqs-trim",
 734				       &tegra_host->dqs_trim);
 735	if (err)
 736		tegra_host->dqs_trim = 0x11;
 737}
 738
 739static void tegra_sdhci_parse_dt(struct sdhci_host *host)
 740{
 741	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
 742	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
 743
 744	if (device_property_read_bool(host->mmc->parent, "supports-cqe"))
 745		tegra_host->enable_hwcq = true;
 746	else
 747		tegra_host->enable_hwcq = false;
 748
 749	tegra_sdhci_parse_pad_autocal_dt(host);
 750	tegra_sdhci_parse_tap_and_trim(host);
 751}
 752
 753static void tegra_sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
 754{
 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;
 758
 759	if (!clock)
 760		return sdhci_set_clock(host, clock);
 761
 762	/*
 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.
 768	 *
 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.
 773	 */
 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;
 779	else
 780		host->max_clk = clk_get_rate(pltfm_host->clk);
 781
 782	sdhci_set_clock(host, clock);
 783
 784	if (tegra_host->pad_calib_required) {
 785		tegra_sdhci_pad_autocalib(host);
 786		tegra_host->pad_calib_required = false;
 787	}
 788}
 789
 790static unsigned int tegra_sdhci_get_max_clock(struct sdhci_host *host)
 791{
 792	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
 793
 794	return clk_round_rate(pltfm_host->clk, UINT_MAX);
 795}
 796
 797static void tegra_sdhci_set_dqs_trim(struct sdhci_host *host, u8 trim)
 798{
 799	u32 val;
 800
 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);
 805}
 806
 807static void tegra_sdhci_hs400_dll_cal(struct sdhci_host *host)
 808{
 809	u32 reg;
 810	int err;
 811
 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);
 815
 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),
 819				 1000, 5000);
 820	if (err)
 821		dev_err(mmc_dev(host->mmc),
 822			"HS400 delay line calibration timed out\n");
 823}
 824
 825static void tegra_sdhci_tap_correction(struct sdhci_host *host, u8 thd_up,
 826				       u8 thd_low, u8 fixed_tap)
 827{
 828	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
 829	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
 830	u32 val, tun_status;
 831	u8 word, bit, edge1, tap, window;
 832	bool tap_result;
 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;
 839	u8 end_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;
 843
 844	/*
 845	 * Read auto-tuned results and extract good valid passing window by
 846	 * filtering out un-wanted bubble/partial/merged windows.
 847	 */
 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;
 851		val |= word;
 852		sdhci_writel(host, val, SDHCI_VNDR_TUN_CTRL0_0);
 853		tun_status = sdhci_readl(host, SDHCI_TEGRA_VNDR_TUN_STATUS0);
 854		bit = 0;
 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) {
 859				start_fail = true;
 860				if (!first_fail) {
 861					first_fail_tap = tap;
 862					first_fail = true;
 863				}
 864
 865			} else if (tap_result && start_fail && !start_pass) {
 866				start_pass_tap = tap;
 867				start_pass = true;
 868				if (!first_pass) {
 869					first_pass_tap = tap;
 870					first_pass = true;
 871				}
 872
 873			} else if (!tap_result && start_fail && start_pass &&
 874				   !end_pass) {
 875				end_pass_tap = tap - 1;
 876				end_pass = true;
 877			} else if (tap_result && start_pass && start_fail &&
 878				   end_pass) {
 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;
 883					end_pass = false;
 884				} else {
 885					/* set tap at middle of valid window */
 886					tap = start_pass_tap + window / 2;
 887					tegra_host->tuned_tap_delay = tap;
 888					return;
 889				}
 890			}
 891
 892			bit++;
 893		}
 894	}
 895
 896	if (!first_fail) {
 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;
 903		else
 904			tegra_host->tuned_tap_delay = edge1 + fixed_tap;
 905	}
 906}
 907
 908static void tegra_sdhci_post_tuning(struct sdhci_host *host)
 909{
 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;
 916	u8 num_iter;
 917	u32 clk_rate_mhz, period_ps, bestcase, worstcase;
 918
 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;
 930		/*
 931		 * Upper and Lower bound thresholds used to detect merged and
 932		 * bubble windows
 933		 */
 934		thdupper = (2 * worstcase + bestcase) / 2;
 935		thdlower = worstcase / 4;
 936		/*
 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
 939		 */
 940		avg_tap_dly = (period_ps * 2) / (min_tap_dly + max_tap_dly);
 941		fixed_tap = avg_tap_dly / 2;
 942
 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;
 949		/*
 950		 * partial window includes edges of the tuning range.
 951		 * merged window includes more taps so window width is higher
 952		 * than upper threshold.
 953		 */
 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,
 959						   fixed_tap);
 960		}
 961	}
 962
 963	tegra_sdhci_set_tap(host, tegra_host->tuned_tap_delay);
 964}
 965
 966static int tegra_sdhci_execute_hw_tuning(struct mmc_host *mmc, u32 opcode)
 967{
 968	struct sdhci_host *host = mmc_priv(mmc);
 969	int err;
 970
 971	err = sdhci_execute_tuning(mmc, opcode);
 972	if (!err && !host->tuning_err)
 973		tegra_sdhci_post_tuning(host);
 974
 975	return err;
 976}
 977
 978static void tegra_sdhci_set_uhs_signaling(struct sdhci_host *host,
 979					  unsigned timing)
 980{
 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;
 986	u8 iter = TRIES_256;
 987	u32 val;
 988
 989	tegra_host->ddr_signaling = false;
 990	switch (timing) {
 991	case MMC_TIMING_UHS_SDR50:
 992		break;
 993	case MMC_TIMING_UHS_SDR104:
 994	case MMC_TIMING_MMC_HS200:
 995		/* Don't set default tap on tunable modes. */
 996		iter = TRIES_128;
 997		break;
 998	case MMC_TIMING_MMC_HS400:
 999		set_dqs_trim = true;
1000		do_hs400_dll_cal = true;
1001		iter = TRIES_128;
1002		break;
1003	case MMC_TIMING_MMC_DDR52:
1004	case MMC_TIMING_UHS_DDR50:
1005		tegra_host->ddr_signaling = true;
1006		set_default_tap = true;
1007		break;
1008	default:
1009		set_default_tap = true;
1010		break;
1011	}
1012
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);
1022
1023	host->tuning_loop_count = (iter == TRIES_128) ? 128 : 256;
1024
1025	sdhci_set_uhs_signaling(host, timing);
1026
1027	tegra_sdhci_pad_autocalib(host);
1028
1029	if (tegra_host->tuned_tap_delay && !set_default_tap)
1030		tegra_sdhci_set_tap(host, tegra_host->tuned_tap_delay);
1031	else
1032		tegra_sdhci_set_tap(host, tegra_host->default_tap);
1033
1034	if (set_dqs_trim)
1035		tegra_sdhci_set_dqs_trim(host, tegra_host->dqs_trim);
1036
1037	if (do_hs400_dll_cal)
1038		tegra_sdhci_hs400_dll_cal(host);
1039}
1040
1041static int tegra_sdhci_execute_tuning(struct sdhci_host *host, u32 opcode)
1042{
1043	unsigned int min, max;
1044
1045	/*
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.
1049	 */
1050	min = 10;
1051	while (min < 255) {
1052		tegra_sdhci_set_tap(host, min);
1053		if (!mmc_send_tuning(host->mmc, opcode, NULL))
1054			break;
1055		min++;
1056	}
1057
1058	/* Find the maximum tap value that still passes. */
1059	max = min + 1;
1060	while (max < 255) {
1061		tegra_sdhci_set_tap(host, max);
1062		if (mmc_send_tuning(host->mmc, opcode, NULL)) {
1063			max--;
1064			break;
1065		}
1066		max++;
1067	}
1068
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));
1071
1072	return mmc_send_tuning(host->mmc, opcode, NULL);
1073}
1074
1075static int sdhci_tegra_start_signal_voltage_switch(struct mmc_host *mmc,
1076						   struct mmc_ios *ios)
1077{
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);
1081	int ret = 0;
1082
1083	if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_330) {
1084		ret = tegra_sdhci_set_padctrl(host, ios->signal_voltage, true);
1085		if (ret < 0)
1086			return ret;
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);
1090		if (ret < 0)
1091			return ret;
1092		ret = tegra_sdhci_set_padctrl(host, ios->signal_voltage, true);
1093	}
1094
1095	if (tegra_host->pad_calib_required)
1096		tegra_sdhci_pad_autocalib(host);
1097
1098	return ret;
1099}
1100
1101static int tegra_sdhci_init_pinctrl_info(struct device *dev,
1102					 struct sdhci_tegra *tegra_host)
1103{
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));
1108		return -1;
1109	}
1110
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;
1116	}
1117
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;
1123	}
1124
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));
1130		return -1;
1131	}
1132
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));
1138		return -1;
1139	}
1140
1141	tegra_host->pad_control_available = true;
1142
1143	return 0;
1144}
1145
1146static void tegra_sdhci_voltage_switch(struct sdhci_host *host)
1147{
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;
1151
1152	if (soc_data->nvquirks & NVQUIRK_HAS_PADCALIB)
1153		tegra_host->pad_calib_required = true;
1154}
1155
1156static void tegra_cqhci_writel(struct cqhci_host *cq_host, u32 val, int reg)
1157{
1158	struct mmc_host *mmc = cq_host->mmc;
1159	u8 ctrl;
1160	ktime_t timeout;
1161	bool timed_out;
1162
1163	/*
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.
1170	 */
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);
1176		while (1) {
1177			timed_out = ktime_compare(ktime_get(), timeout) > 0;
1178			ctrl = cqhci_readl(cq_host, CQHCI_CTL);
1179			if (!(ctrl & CQHCI_HALT) || timed_out)
1180				break;
1181		}
1182		/*
1183		 * CQE usually resumes very quick, but incase if Tegra CQE
1184		 * doesn't resume retry unhalt.
1185		 */
1186		if (timed_out)
1187			writel(val, cq_host->mmio + reg);
1188	} else {
1189		writel(val, cq_host->mmio + reg);
1190	}
1191}
1192
1193static void sdhci_tegra_update_dcmd_desc(struct mmc_host *mmc,
1194					 struct mmc_request *mrq, u64 *data)
1195{
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;
1199
1200	if (soc_data->nvquirks & NVQUIRK_CQHCI_DCMD_R1B_CMD_TIMING &&
1201	    mrq->cmd->flags & MMC_RSP_R1B)
1202		*data |= CQHCI_CMD_TIMING(1);
1203}
1204
1205static void sdhci_tegra_cqe_enable(struct mmc_host *mmc)
1206{
1207	struct cqhci_host *cq_host = mmc->cqe_private;
1208	u32 val;
1209
1210	/*
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.
1215	 */
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),
1220				     CQHCI_CFG);
1221		sdhci_cqe_enable(mmc);
1222		if (val & CQHCI_ENABLE)
1223			cqhci_writel(cq_host, val, CQHCI_CFG);
1224	}
1225
1226	/*
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.
1232	 */
1233	val = cqhci_readl(cq_host, CQHCI_SSC1);
1234	val &= ~CQHCI_SSC1_CBC_MASK;
1235	cqhci_writel(cq_host, val, CQHCI_SSC1);
1236}
1237
1238static void sdhci_tegra_dumpregs(struct mmc_host *mmc)
1239{
1240	sdhci_dumpregs(mmc_priv(mmc));
1241}
1242
1243static u32 sdhci_tegra_cqhci_irq(struct sdhci_host *host, u32 intmask)
1244{
1245	int cmd_error = 0;
1246	int data_error = 0;
1247
1248	if (!sdhci_cqe_irq(host, intmask, &cmd_error, &data_error))
1249		return intmask;
1250
1251	cqhci_irq(host->mmc, intmask, cmd_error, data_error);
1252
1253	return 0;
1254}
1255
1256static void tegra_sdhci_set_timeout(struct sdhci_host *host,
1257				    struct mmc_command *cmd)
1258{
1259	u32 val;
1260
1261	/*
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.
1265	 *
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.
1269	 *
1270	 * So, use infinite busy wait mode for operations that may take
1271	 * more than maximum HW busy timeout of 11s otherwise use finite
1272	 * busy wait mode.
1273	 */
1274	val = sdhci_readl(host, SDHCI_TEGRA_VENDOR_MISC_CTRL);
1275	if (cmd && cmd->busy_timeout >= 11 * HZ)
1276		val |= SDHCI_MISC_CTRL_ERASE_TIMEOUT_LIMIT;
1277	else
1278		val &= ~SDHCI_MISC_CTRL_ERASE_TIMEOUT_LIMIT;
1279	sdhci_writel(host, val, SDHCI_TEGRA_VENDOR_MISC_CTRL);
1280
1281	__sdhci_set_timeout(host, cmd);
1282}
1283
1284static 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,
1290};
1291
1292static int tegra_sdhci_set_dma_mask(struct sdhci_host *host)
1293{
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);
1298
1299	if (soc->dma_mask)
1300		return dma_set_mask_and_coherent(dev, soc->dma_mask);
1301
1302	return 0;
1303}
1304
1305static 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,
1317};
1318
1319static 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,
1326};
1327
1328static 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,
1333};
1334
1335static 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 |
1344		   /*
1345		    * Auto-CMD23 leads to "Got command interrupt 0x00010000 even
1346		    * though no command operation was in progress."
1347		    *
1348		    * The exact reason is unknown, as the same hardware seems
1349		    * to support Auto CMD23 on a downstream 3.1 kernel.
1350		    */
1351		   SDHCI_QUIRK2_ACMD23_BROKEN,
1352	.ops  = &tegra_sdhci_ops,
1353};
1354
1355static 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,
1362};
1363
1364static 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,
1377};
1378
1379static 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,
1388};
1389
1390static const struct sdhci_tegra_soc_data soc_data_tegra114 = {
1391	.pdata = &sdhci_tegra114_pdata,
1392	.dma_mask = DMA_BIT_MASK(32),
1393};
1394
1395static 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,
1404};
1405
1406static const struct sdhci_tegra_soc_data soc_data_tegra124 = {
1407	.pdata = &sdhci_tegra124_pdata,
1408	.dma_mask = DMA_BIT_MASK(34),
1409};
1410
1411static 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,
1424};
1425
1426static 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,
1434};
1435
1436static 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 |
1444		    NVQUIRK_HAS_TMCLK,
1445	.min_tap_delay = 106,
1446	.max_tap_delay = 185,
1447};
1448
1449static 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,
1462};
1463
1464static 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,
1472};
1473
1474static 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 |
1482		    NVQUIRK_HAS_TMCLK |
1483		    NVQUIRK_CQHCI_DCMD_R1B_CMD_TIMING,
1484	.min_tap_delay = 84,
1485	.max_tap_delay = 136,
1486};
1487
1488static 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 |
1496		    NVQUIRK_HAS_TMCLK,
1497	.min_tap_delay = 96,
1498	.max_tap_delay = 139,
1499};
1500
1501static 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 },
1509	{}
1510};
1511MODULE_DEVICE_TABLE(of, sdhci_tegra_dt_match);
1512
1513static int sdhci_tegra_add_host(struct sdhci_host *host)
1514{
 
 
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;
1518	bool dma64;
1519	int ret;
1520
1521	if (!tegra_host->enable_hwcq)
1522		return sdhci_add_host(host);
1523
1524	sdhci_enable_v4_mode(host);
1525
1526	ret = sdhci_setup_host(host);
1527	if (ret)
1528		return ret;
1529
1530	host->mmc->caps2 |= MMC_CAP2_CQE | MMC_CAP2_CQE_DCMD;
1531
1532	cq_host = devm_kzalloc(host->mmc->parent,
1533				sizeof(*cq_host), GFP_KERNEL);
1534	if (!cq_host) {
1535		ret = -ENOMEM;
1536		goto cleanup;
1537	}
1538
1539	cq_host->mmio = host->ioaddr + SDHCI_TEGRA_CQE_BASE_ADDR;
1540	cq_host->ops = &sdhci_tegra_cqhci_ops;
1541
1542	dma64 = host->flags & SDHCI_USE_64_BIT_DMA;
1543	if (dma64)
1544		cq_host->caps |= CQHCI_TASK_DESC_SZ_128;
1545
1546	ret = cqhci_init(cq_host, host->mmc, dma64);
1547	if (ret)
1548		goto cleanup;
1549
1550	ret = __sdhci_add_host(host);
1551	if (ret)
1552		goto cleanup;
1553
1554	return 0;
1555
1556cleanup:
1557	sdhci_cleanup_host(host);
1558	return ret;
1559}
1560
1561static int sdhci_tegra_probe(struct platform_device *pdev)
1562{
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;
1568	struct clk *clk;
1569	int rc;
1570
1571	match = of_match_device(sdhci_tegra_dt_match, &pdev->dev);
1572	if (!match)
1573		return -EINVAL;
1574	soc_data = match->data;
1575
1576	host = sdhci_pltfm_init(pdev, soc_data->pdata, sizeof(*tegra_host));
1577	if (IS_ERR(host))
1578		return PTR_ERR(host);
1579	pltfm_host = sdhci_priv(host);
1580
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;
 
1586
1587	if (soc_data->nvquirks & NVQUIRK_NEEDS_PAD_CONTROL) {
1588		rc = tegra_sdhci_init_pinctrl_info(&pdev->dev, tegra_host);
1589		if (rc == 0)
1590			host->mmc_host_ops.start_signal_voltage_switch =
1591				sdhci_tegra_start_signal_voltage_switch;
1592	}
1593
1594	/* Hook to periodically rerun pad calibration */
1595	if (soc_data->nvquirks & NVQUIRK_HAS_PADCALIB)
1596		host->mmc_host_ops.request = tegra_sdhci_request;
1597
1598	host->mmc_host_ops.hs400_enhanced_strobe =
1599			tegra_sdhci_hs400_enhanced_strobe;
1600
1601	if (!host->ops->platform_execute_tuning)
1602		host->mmc_host_ops.execute_tuning =
1603				tegra_sdhci_execute_hw_tuning;
1604
1605	rc = mmc_of_parse(host->mmc);
1606	if (rc)
1607		goto err_parse_dt;
1608
1609	if (tegra_host->soc_data->nvquirks & NVQUIRK_ENABLE_DDR50)
1610		host->mmc->caps |= MMC_CAP_1_8V_DDR;
1611
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;
1614
1615	tegra_sdhci_parse_dt(host);
1616
1617	tegra_host->power_gpio = devm_gpiod_get_optional(&pdev->dev, "power",
1618							 GPIOD_OUT_HIGH);
1619	if (IS_ERR(tegra_host->power_gpio)) {
1620		rc = PTR_ERR(tegra_host->power_gpio);
1621		goto err_power_req;
1622	}
1623
1624	/*
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.
1629	 *
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.
1634	 *
1635	 * So, TMCLK is set to 12Mhz and kept enabled all the time on SoC's
1636	 * supporting separate TMCLK.
1637	 */
1638
1639	if (soc_data->nvquirks & NVQUIRK_HAS_TMCLK) {
1640		clk = devm_clk_get(&pdev->dev, "tmclk");
1641		if (IS_ERR(clk)) {
1642			rc = PTR_ERR(clk);
1643			if (rc == -EPROBE_DEFER)
1644				goto err_power_req;
1645
1646			dev_warn(&pdev->dev, "failed to get tmclk: %d\n", rc);
1647			clk = NULL;
1648		}
1649
1650		clk_set_rate(clk, 12000000);
1651		rc = clk_prepare_enable(clk);
1652		if (rc) {
1653			dev_err(&pdev->dev,
1654				"failed to enable tmclk: %d\n", rc);
1655			goto err_power_req;
1656		}
1657
1658		tegra_host->tmclk = clk;
1659	}
1660
1661	clk = devm_clk_get(mmc_dev(host->mmc), NULL);
1662	if (IS_ERR(clk)) {
 
1663		rc = PTR_ERR(clk);
1664
1665		if (rc != -EPROBE_DEFER)
1666			dev_err(&pdev->dev, "failed to get clock: %d\n", rc);
1667
1668		goto err_clk_get;
1669	}
1670	clk_prepare_enable(clk);
1671	pltfm_host->clk = clk;
1672
1673	tegra_host->rst = devm_reset_control_get_exclusive(&pdev->dev,
1674							   "sdhci");
1675	if (IS_ERR(tegra_host->rst)) {
1676		rc = PTR_ERR(tegra_host->rst);
1677		dev_err(&pdev->dev, "failed to get reset control: %d\n", rc);
1678		goto err_rst_get;
1679	}
1680
1681	rc = reset_control_assert(tegra_host->rst);
1682	if (rc)
1683		goto err_rst_get;
1684
1685	usleep_range(2000, 4000);
1686
1687	rc = reset_control_deassert(tegra_host->rst);
1688	if (rc)
1689		goto err_rst_get;
1690
1691	usleep_range(2000, 4000);
1692
1693	rc = sdhci_tegra_add_host(host);
1694	if (rc)
1695		goto err_add_host;
1696
1697	return 0;
1698
1699err_add_host:
1700	reset_control_assert(tegra_host->rst);
1701err_rst_get:
1702	clk_disable_unprepare(pltfm_host->clk);
 
1703err_clk_get:
1704	clk_disable_unprepare(tegra_host->tmclk);
 
1705err_power_req:
1706err_parse_dt:
 
1707	sdhci_pltfm_free(pdev);
1708	return rc;
1709}
1710
1711static int sdhci_tegra_remove(struct platform_device *pdev)
1712{
1713	struct sdhci_host *host = platform_get_drvdata(pdev);
1714	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1715	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
 
 
 
1716
1717	sdhci_remove_host(host, 0);
 
1718
1719	reset_control_assert(tegra_host->rst);
1720	usleep_range(2000, 4000);
1721	clk_disable_unprepare(pltfm_host->clk);
1722	clk_disable_unprepare(tegra_host->tmclk);
1723
1724	sdhci_pltfm_free(pdev);
1725
1726	return 0;
1727}
1728
1729#ifdef CONFIG_PM_SLEEP
1730static int __maybe_unused sdhci_tegra_suspend(struct device *dev)
1731{
1732	struct sdhci_host *host = dev_get_drvdata(dev);
1733	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1734	int ret;
1735
1736	if (host->mmc->caps2 & MMC_CAP2_CQE) {
1737		ret = cqhci_suspend(host->mmc);
1738		if (ret)
1739			return ret;
1740	}
1741
1742	ret = sdhci_suspend_host(host);
1743	if (ret) {
1744		cqhci_resume(host->mmc);
1745		return ret;
1746	}
1747
1748	clk_disable_unprepare(pltfm_host->clk);
1749	return 0;
1750}
1751
1752static int __maybe_unused sdhci_tegra_resume(struct device *dev)
1753{
1754	struct sdhci_host *host = dev_get_drvdata(dev);
1755	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1756	int ret;
1757
1758	ret = clk_prepare_enable(pltfm_host->clk);
1759	if (ret)
1760		return ret;
1761
1762	ret = sdhci_resume_host(host);
1763	if (ret)
1764		goto disable_clk;
1765
1766	if (host->mmc->caps2 & MMC_CAP2_CQE) {
1767		ret = cqhci_resume(host->mmc);
1768		if (ret)
1769			goto suspend_host;
1770	}
1771
1772	return 0;
1773
1774suspend_host:
1775	sdhci_suspend_host(host);
1776disable_clk:
1777	clk_disable_unprepare(pltfm_host->clk);
1778	return ret;
1779}
1780#endif
1781
1782static SIMPLE_DEV_PM_OPS(sdhci_tegra_dev_pm_ops, sdhci_tegra_suspend,
1783			 sdhci_tegra_resume);
1784
1785static struct platform_driver sdhci_tegra_driver = {
1786	.driver		= {
1787		.name	= "sdhci-tegra",
 
1788		.of_match_table = sdhci_tegra_dt_match,
1789		.pm	= &sdhci_tegra_dev_pm_ops,
1790	},
1791	.probe		= sdhci_tegra_probe,
1792	.remove		= sdhci_tegra_remove,
1793};
1794
1795module_platform_driver(sdhci_tegra_driver);
1796
1797MODULE_DESCRIPTION("SDHCI driver for Tegra");
1798MODULE_AUTHOR("Google, Inc.");
1799MODULE_LICENSE("GPL v2");