sdhci-tegra.c 22.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * Copyright (C) 2010 Google, Inc.
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

15
#include <linux/delay.h>
16
#include <linux/err.h>
17
#include <linux/module.h>
18
#include <linux/init.h>
19
#include <linux/iopoll.h>
20 21 22
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/io.h>
23
#include <linux/of.h>
24
#include <linux/of_device.h>
25 26
#include <linux/pinctrl/consumer.h>
#include <linux/regulator/consumer.h>
27
#include <linux/reset.h>
28 29
#include <linux/mmc/card.h>
#include <linux/mmc/host.h>
L
Lucas Stach 已提交
30
#include <linux/mmc/mmc.h>
31
#include <linux/mmc/slot-gpio.h>
32
#include <linux/gpio/consumer.h>
33 34 35

#include "sdhci-pltfm.h"

36
/* Tegra SDHOST controller vendor register definitions */
L
Lucas Stach 已提交
37
#define SDHCI_TEGRA_VENDOR_CLOCK_CTRL			0x100
L
Lucas Stach 已提交
38 39 40
#define SDHCI_CLOCK_CTRL_TAP_MASK			0x00ff0000
#define SDHCI_CLOCK_CTRL_TAP_SHIFT			16
#define SDHCI_CLOCK_CTRL_SDR50_TUNING_OVERRIDE		BIT(5)
L
Lucas Stach 已提交
41 42 43
#define SDHCI_CLOCK_CTRL_PADPIPE_CLKEN_OVERRIDE		BIT(3)
#define SDHCI_CLOCK_CTRL_SPI_MODE_CLKEN_OVERRIDE	BIT(2)

44 45 46 47 48 49 50 51 52 53 54 55 56
#define SDHCI_TEGRA_VENDOR_MISC_CTRL			0x120
#define SDHCI_MISC_CTRL_ENABLE_SDR104			0x8
#define SDHCI_MISC_CTRL_ENABLE_SDR50			0x10
#define SDHCI_MISC_CTRL_ENABLE_SDHCI_SPEC_300		0x20
#define SDHCI_MISC_CTRL_ENABLE_DDR50			0x200

#define SDHCI_TEGRA_AUTO_CAL_CONFIG			0x1e4
#define SDHCI_AUTO_CAL_START				BIT(31)
#define SDHCI_AUTO_CAL_ENABLE				BIT(29)

#define SDHCI_TEGRA_SDMEM_COMP_PADCTRL			0x1e0
#define SDHCI_TEGRA_SDMEM_COMP_PADCTRL_VREF_SEL_MASK	0x0000000f
#define SDHCI_TEGRA_SDMEM_COMP_PADCTRL_VREF_SEL_VAL	0x7
57
#define SDHCI_TEGRA_SDMEM_COMP_PADCTRL_E_INPUT_E_PWRD	BIT(31)
58 59 60 61 62 63 64 65 66 67 68 69

#define SDHCI_TEGRA_AUTO_CAL_STATUS			0x1ec
#define SDHCI_TEGRA_AUTO_CAL_ACTIVE			BIT(31)

#define NVQUIRK_FORCE_SDHCI_SPEC_200			BIT(0)
#define NVQUIRK_ENABLE_BLOCK_GAP_DET			BIT(1)
#define NVQUIRK_ENABLE_SDHCI_SPEC_300			BIT(2)
#define NVQUIRK_ENABLE_SDR50				BIT(3)
#define NVQUIRK_ENABLE_SDR104				BIT(4)
#define NVQUIRK_ENABLE_DDR50				BIT(5)
#define NVQUIRK_HAS_PADCALIB				BIT(6)
#define NVQUIRK_NEEDS_PAD_CONTROL			BIT(7)
70 71

struct sdhci_tegra_soc_data {
72
	const struct sdhci_pltfm_data *pdata;
73 74 75 76 77
	u32 nvquirks;
};

struct sdhci_tegra {
	const struct sdhci_tegra_soc_data *soc_data;
78
	struct gpio_desc *power_gpio;
79
	bool ddr_signaling;
80
	bool pad_calib_required;
81
	bool pad_control_available;
82 83

	struct reset_control *rst;
84 85 86
	struct pinctrl *pinctrl_sdmmc;
	struct pinctrl_state *pinctrl_state_3v3;
	struct pinctrl_state *pinctrl_state_1v8;
87 88
};

89 90
static u16 tegra_sdhci_readw(struct sdhci_host *host, int reg)
{
91
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
92
	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
93 94 95 96
	const struct sdhci_tegra_soc_data *soc_data = tegra_host->soc_data;

	if (unlikely((soc_data->nvquirks & NVQUIRK_FORCE_SDHCI_SPEC_200) &&
			(reg == SDHCI_HOST_VERSION))) {
97 98 99 100 101 102 103
		/* Erratum: Version register is invalid in HW. */
		return SDHCI_SPEC_200;
	}

	return readw(host->ioaddr + reg);
}

104 105 106 107
static void tegra_sdhci_writew(struct sdhci_host *host, u16 val, int reg)
{
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);

108 109 110 111 112 113 114 115 116 117 118 119
	switch (reg) {
	case SDHCI_TRANSFER_MODE:
		/*
		 * Postpone this write, we must do it together with a
		 * command write that is down below.
		 */
		pltfm_host->xfer_mode_shadow = val;
		return;
	case SDHCI_COMMAND:
		writel((val << 16) | pltfm_host->xfer_mode_shadow,
			host->ioaddr + SDHCI_TRANSFER_MODE);
		return;
120 121 122 123 124
	}

	writew(val, host->ioaddr + reg);
}

125 126
static void tegra_sdhci_writel(struct sdhci_host *host, u32 val, int reg)
{
127
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
128
	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
129 130
	const struct sdhci_tegra_soc_data *soc_data = tegra_host->soc_data;

131 132 133 134 135 136 137 138 139
	/* Seems like we're getting spurious timeout and crc errors, so
	 * disable signalling of them. In case of real errors software
	 * timers should take care of eventually detecting them.
	 */
	if (unlikely(reg == SDHCI_SIGNAL_ENABLE))
		val &= ~(SDHCI_INT_TIMEOUT|SDHCI_INT_CRC);

	writel(val, host->ioaddr + reg);

140 141
	if (unlikely((soc_data->nvquirks & NVQUIRK_ENABLE_BLOCK_GAP_DET) &&
			(reg == SDHCI_INT_ENABLE))) {
142 143 144 145 146 147 148 149 150 151
		/* Erratum: Must enable block gap interrupt detection */
		u8 gap_ctrl = readb(host->ioaddr + SDHCI_BLOCK_GAP_CONTROL);
		if (val & SDHCI_INT_CARD_INT)
			gap_ctrl |= 0x8;
		else
			gap_ctrl &= ~0x8;
		writeb(gap_ctrl, host->ioaddr + SDHCI_BLOCK_GAP_CONTROL);
	}
}

152
static unsigned int tegra_sdhci_get_ro(struct sdhci_host *host)
153
{
154
	return mmc_gpio_get_ro(host->mmc);
155 156
}

157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
static bool tegra_sdhci_is_pad_and_regulator_valid(struct sdhci_host *host)
{
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
	int has_1v8, has_3v3;

	/*
	 * The SoCs which have NVQUIRK_NEEDS_PAD_CONTROL require software pad
	 * voltage configuration in order to perform voltage switching. This
	 * means that valid pinctrl info is required on SDHCI instances capable
	 * of performing voltage switching. Whether or not an SDHCI instance is
	 * capable of voltage switching is determined based on the regulator.
	 */

	if (!(tegra_host->soc_data->nvquirks & NVQUIRK_NEEDS_PAD_CONTROL))
		return true;

	if (IS_ERR(host->mmc->supply.vqmmc))
		return false;

	has_1v8 = regulator_is_supported_voltage(host->mmc->supply.vqmmc,
						 1700000, 1950000);

	has_3v3 = regulator_is_supported_voltage(host->mmc->supply.vqmmc,
						 2700000, 3600000);

	if (has_1v8 == 1 && has_3v3 == 1)
		return tegra_host->pad_control_available;

	/* Fixed voltage, no pad control required. */
	return true;
}

190
static void tegra_sdhci_reset(struct sdhci_host *host, u8 mask)
191 192
{
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
193
	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
194
	const struct sdhci_tegra_soc_data *soc_data = tegra_host->soc_data;
195
	u32 misc_ctrl, clk_ctrl, pad_ctrl;
196

197 198
	sdhci_reset(host, mask);

199 200 201
	if (!(mask & SDHCI_RESET_ALL))
		return;

202
	misc_ctrl = sdhci_readl(host, SDHCI_TEGRA_VENDOR_MISC_CTRL);
L
Lucas Stach 已提交
203
	clk_ctrl = sdhci_readl(host, SDHCI_TEGRA_VENDOR_CLOCK_CTRL);
204 205 206 207 208 209

	misc_ctrl &= ~(SDHCI_MISC_CTRL_ENABLE_SDHCI_SPEC_300 |
		       SDHCI_MISC_CTRL_ENABLE_SDR50 |
		       SDHCI_MISC_CTRL_ENABLE_DDR50 |
		       SDHCI_MISC_CTRL_ENABLE_SDR104);

L
Lucas Stach 已提交
210
	clk_ctrl &= ~SDHCI_CLOCK_CTRL_SPI_MODE_CLKEN_OVERRIDE;
211

212
	if (tegra_sdhci_is_pad_and_regulator_valid(host)) {
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
		/* Erratum: Enable SDHCI spec v3.00 support */
		if (soc_data->nvquirks & NVQUIRK_ENABLE_SDHCI_SPEC_300)
			misc_ctrl |= SDHCI_MISC_CTRL_ENABLE_SDHCI_SPEC_300;
		/* Advertise UHS modes as supported by host */
		if (soc_data->nvquirks & NVQUIRK_ENABLE_SDR50)
			misc_ctrl |= SDHCI_MISC_CTRL_ENABLE_SDR50;
		if (soc_data->nvquirks & NVQUIRK_ENABLE_DDR50)
			misc_ctrl |= SDHCI_MISC_CTRL_ENABLE_DDR50;
		if (soc_data->nvquirks & NVQUIRK_ENABLE_SDR104)
			misc_ctrl |= SDHCI_MISC_CTRL_ENABLE_SDR104;
		if (soc_data->nvquirks & SDHCI_MISC_CTRL_ENABLE_SDR50)
			clk_ctrl |= SDHCI_CLOCK_CTRL_SDR50_TUNING_OVERRIDE;
	}

	sdhci_writel(host, misc_ctrl, SDHCI_TEGRA_VENDOR_MISC_CTRL);
L
Lucas Stach 已提交
228 229
	sdhci_writel(host, clk_ctrl, SDHCI_TEGRA_VENDOR_CLOCK_CTRL);

230 231 232 233 234 235
	if (soc_data->nvquirks & NVQUIRK_HAS_PADCALIB) {
		pad_ctrl = sdhci_readl(host, SDHCI_TEGRA_SDMEM_COMP_PADCTRL);
		pad_ctrl &= ~SDHCI_TEGRA_SDMEM_COMP_PADCTRL_VREF_SEL_MASK;
		pad_ctrl |= SDHCI_TEGRA_SDMEM_COMP_PADCTRL_VREF_SEL_VAL;
		sdhci_writel(host, pad_ctrl, SDHCI_TEGRA_SDMEM_COMP_PADCTRL);

236
		tegra_host->pad_calib_required = true;
237
	}
238

239
	tegra_host->ddr_signaling = false;
240 241
}

242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
static void tegra_sdhci_configure_cal_pad(struct sdhci_host *host, bool enable)
{
	u32 val;

	/*
	 * Enable or disable the additional I/O pad used by the drive strength
	 * calibration process.
	 */
	val = sdhci_readl(host, SDHCI_TEGRA_SDMEM_COMP_PADCTRL);

	if (enable)
		val |= SDHCI_TEGRA_SDMEM_COMP_PADCTRL_E_INPUT_E_PWRD;
	else
		val &= ~SDHCI_TEGRA_SDMEM_COMP_PADCTRL_E_INPUT_E_PWRD;

	sdhci_writel(host, val, SDHCI_TEGRA_SDMEM_COMP_PADCTRL);

	if (enable)
		usleep_range(1, 2);
}

263 264
static void tegra_sdhci_pad_autocalib(struct sdhci_host *host)
{
265 266 267
	u32 reg;
	int ret;

268 269
	tegra_sdhci_configure_cal_pad(host, true);

270 271 272
	reg = sdhci_readl(host, SDHCI_TEGRA_AUTO_CAL_CONFIG);
	reg |= SDHCI_AUTO_CAL_ENABLE | SDHCI_AUTO_CAL_START;
	sdhci_writel(host, reg, SDHCI_TEGRA_AUTO_CAL_CONFIG);
273

274 275 276 277 278
	usleep_range(1, 2);
	/* 10 ms timeout */
	ret = readl_poll_timeout(host->ioaddr + SDHCI_TEGRA_AUTO_CAL_STATUS,
				 reg, !(reg & SDHCI_TEGRA_AUTO_CAL_ACTIVE),
				 1000, 10000);
279

280 281
	tegra_sdhci_configure_cal_pad(host, false);

282 283
	if (ret)
		dev_err(mmc_dev(host->mmc), "Pad autocal timed out\n");
284 285
}

286 287 288
static void tegra_sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
{
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
289
	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
290 291 292
	unsigned long host_clk;

	if (!clock)
293
		return sdhci_set_clock(host, clock);
294

295 296 297 298 299 300 301 302 303 304 305 306
	/*
	 * In DDR50/52 modes the Tegra SDHCI controllers require the SDHCI
	 * divider to be configured to divided the host clock by two. The SDHCI
	 * clock divider is calculated as part of sdhci_set_clock() by
	 * sdhci_calc_clk(). The divider is calculated from host->max_clk and
	 * the requested clock rate.
	 *
	 * By setting the host->max_clk to clock * 2 the divider calculation
	 * will always result in the correct value for DDR50/52 modes,
	 * regardless of clock rate rounding, which may happen if the value
	 * from clk_get_rate() is used.
	 */
307 308
	host_clk = tegra_host->ddr_signaling ? clock * 2 : clock;
	clk_set_rate(pltfm_host->clk, host_clk);
309 310 311 312
	if (tegra_host->ddr_signaling)
		host->max_clk = host_clk;
	else
		host->max_clk = clk_get_rate(pltfm_host->clk);
313

314 315 316 317 318 319
	sdhci_set_clock(host, clock);

	if (tegra_host->pad_calib_required) {
		tegra_sdhci_pad_autocalib(host);
		tegra_host->pad_calib_required = false;
	}
320 321 322 323 324 325
}

static void tegra_sdhci_set_uhs_signaling(struct sdhci_host *host,
					  unsigned timing)
{
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
326
	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
327

S
Stefan Agner 已提交
328 329
	if (timing == MMC_TIMING_UHS_DDR50 ||
	    timing == MMC_TIMING_MMC_DDR52)
330 331
		tegra_host->ddr_signaling = true;

332
	sdhci_set_uhs_signaling(host, timing);
333 334
}

335 336 337 338 339 340 341
static unsigned int tegra_sdhci_get_max_clock(struct sdhci_host *host)
{
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);

	return clk_round_rate(pltfm_host->clk, UINT_MAX);
}

L
Lucas Stach 已提交
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
static void tegra_sdhci_set_tap(struct sdhci_host *host, unsigned int tap)
{
	u32 reg;

	reg = sdhci_readl(host, SDHCI_TEGRA_VENDOR_CLOCK_CTRL);
	reg &= ~SDHCI_CLOCK_CTRL_TAP_MASK;
	reg |= tap << SDHCI_CLOCK_CTRL_TAP_SHIFT;
	sdhci_writel(host, reg, SDHCI_TEGRA_VENDOR_CLOCK_CTRL);
}

static int tegra_sdhci_execute_tuning(struct sdhci_host *host, u32 opcode)
{
	unsigned int min, max;

	/*
	 * Start search for minimum tap value at 10, as smaller values are
	 * may wrongly be reported as working but fail at higher speeds,
	 * according to the TRM.
	 */
	min = 10;
	while (min < 255) {
		tegra_sdhci_set_tap(host, min);
		if (!mmc_send_tuning(host->mmc, opcode, NULL))
			break;
		min++;
	}

	/* Find the maximum tap value that still passes. */
	max = min + 1;
	while (max < 255) {
		tegra_sdhci_set_tap(host, max);
		if (mmc_send_tuning(host->mmc, opcode, NULL)) {
			max--;
			break;
		}
		max++;
	}

	/* The TRM states the ideal tap value is at 75% in the passing range. */
	tegra_sdhci_set_tap(host, min + ((max - min) * 3 / 4));

	return mmc_send_tuning(host->mmc, opcode, NULL);
}

386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463
static int tegra_sdhci_set_padctrl(struct sdhci_host *host, int voltage)
{
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
	int ret;

	if (!tegra_host->pad_control_available)
		return 0;

	if (voltage == MMC_SIGNAL_VOLTAGE_180) {
		ret = pinctrl_select_state(tegra_host->pinctrl_sdmmc,
					   tegra_host->pinctrl_state_1v8);
		if (ret < 0)
			dev_err(mmc_dev(host->mmc),
				"setting 1.8V failed, ret: %d\n", ret);
	} else {
		ret = pinctrl_select_state(tegra_host->pinctrl_sdmmc,
					   tegra_host->pinctrl_state_3v3);
		if (ret < 0)
			dev_err(mmc_dev(host->mmc),
				"setting 3.3V failed, ret: %d\n", ret);
	}

	return ret;
}

static int sdhci_tegra_start_signal_voltage_switch(struct mmc_host *mmc,
						   struct mmc_ios *ios)
{
	struct sdhci_host *host = mmc_priv(mmc);
	int ret = 0;

	if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_330) {
		ret = tegra_sdhci_set_padctrl(host, ios->signal_voltage);
		if (ret < 0)
			return ret;
		ret = sdhci_start_signal_voltage_switch(mmc, ios);
	} else if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_180) {
		ret = sdhci_start_signal_voltage_switch(mmc, ios);
		if (ret < 0)
			return ret;
		ret = tegra_sdhci_set_padctrl(host, ios->signal_voltage);
	}

	return ret;
}

static int tegra_sdhci_init_pinctrl_info(struct device *dev,
					 struct sdhci_tegra *tegra_host)
{
	tegra_host->pinctrl_sdmmc = devm_pinctrl_get(dev);
	if (IS_ERR(tegra_host->pinctrl_sdmmc)) {
		dev_dbg(dev, "No pinctrl info, err: %ld\n",
			PTR_ERR(tegra_host->pinctrl_sdmmc));
		return -1;
	}

	tegra_host->pinctrl_state_3v3 =
		pinctrl_lookup_state(tegra_host->pinctrl_sdmmc, "sdmmc-3v3");
	if (IS_ERR(tegra_host->pinctrl_state_3v3)) {
		dev_warn(dev, "Missing 3.3V pad state, err: %ld\n",
			 PTR_ERR(tegra_host->pinctrl_state_3v3));
		return -1;
	}

	tegra_host->pinctrl_state_1v8 =
		pinctrl_lookup_state(tegra_host->pinctrl_sdmmc, "sdmmc-1v8");
	if (IS_ERR(tegra_host->pinctrl_state_1v8)) {
		dev_warn(dev, "Missing 1.8V pad state, err: %ld\n",
			 PTR_ERR(tegra_host->pinctrl_state_3v3));
		return -1;
	}

	tegra_host->pad_control_available = true;

	return 0;
}

464 465 466 467 468 469 470 471 472 473
static void tegra_sdhci_voltage_switch(struct sdhci_host *host)
{
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
	const struct sdhci_tegra_soc_data *soc_data = tegra_host->soc_data;

	if (soc_data->nvquirks & NVQUIRK_HAS_PADCALIB)
		tegra_host->pad_calib_required = true;
}

474
static const struct sdhci_ops tegra_sdhci_ops = {
475 476 477
	.get_ro     = tegra_sdhci_get_ro,
	.read_w     = tegra_sdhci_readw,
	.write_l    = tegra_sdhci_writel,
478
	.set_clock  = tegra_sdhci_set_clock,
479
	.set_bus_width = sdhci_set_bus_width,
480
	.reset      = tegra_sdhci_reset,
L
Lucas Stach 已提交
481
	.platform_execute_tuning = tegra_sdhci_execute_tuning,
482
	.set_uhs_signaling = tegra_sdhci_set_uhs_signaling,
483
	.voltage_switch = tegra_sdhci_voltage_switch,
484
	.get_max_clock = tegra_sdhci_get_max_clock,
485 486
};

487
static const struct sdhci_pltfm_data sdhci_tegra20_pdata = {
488 489 490
	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
		  SDHCI_QUIRK_NO_HISPD_BIT |
491 492
		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC |
		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
493 494 495
	.ops  = &tegra_sdhci_ops,
};

T
Thierry Reding 已提交
496
static const struct sdhci_tegra_soc_data soc_data_tegra20 = {
497 498 499 500 501
	.pdata = &sdhci_tegra20_pdata,
	.nvquirks = NVQUIRK_FORCE_SDHCI_SPEC_200 |
		    NVQUIRK_ENABLE_BLOCK_GAP_DET,
};

502
static const struct sdhci_pltfm_data sdhci_tegra30_pdata = {
503
	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
504
		  SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
505 506
		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
		  SDHCI_QUIRK_NO_HISPD_BIT |
507 508
		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC |
		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
509
	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
510 511 512 513 514 515 516 517 518
		   SDHCI_QUIRK2_BROKEN_HS200 |
		   /*
		    * Auto-CMD23 leads to "Got command interrupt 0x00010000 even
		    * though no command operation was in progress."
		    *
		    * The exact reason is unknown, as the same hardware seems
		    * to support Auto CMD23 on a downstream 3.1 kernel.
		    */
		   SDHCI_QUIRK2_ACMD23_BROKEN,
519 520
	.ops  = &tegra_sdhci_ops,
};
521

T
Thierry Reding 已提交
522
static const struct sdhci_tegra_soc_data soc_data_tegra30 = {
523
	.pdata = &sdhci_tegra30_pdata,
524
	.nvquirks = NVQUIRK_ENABLE_SDHCI_SPEC_300 |
L
Lucas Stach 已提交
525
		    NVQUIRK_ENABLE_SDR50 |
526 527
		    NVQUIRK_ENABLE_SDR104 |
		    NVQUIRK_HAS_PADCALIB,
528 529
};

530 531 532 533 534
static const struct sdhci_ops tegra114_sdhci_ops = {
	.get_ro     = tegra_sdhci_get_ro,
	.read_w     = tegra_sdhci_readw,
	.write_w    = tegra_sdhci_writew,
	.write_l    = tegra_sdhci_writel,
535
	.set_clock  = tegra_sdhci_set_clock,
536
	.set_bus_width = sdhci_set_bus_width,
537
	.reset      = tegra_sdhci_reset,
L
Lucas Stach 已提交
538
	.platform_execute_tuning = tegra_sdhci_execute_tuning,
539
	.set_uhs_signaling = tegra_sdhci_set_uhs_signaling,
540
	.voltage_switch = tegra_sdhci_voltage_switch,
541
	.get_max_clock = tegra_sdhci_get_max_clock,
542 543
};

544
static const struct sdhci_pltfm_data sdhci_tegra114_pdata = {
545 546 547 548
	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
		  SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
		  SDHCI_QUIRK_NO_HISPD_BIT |
549 550
		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC |
		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
551
	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
552
	.ops  = &tegra114_sdhci_ops,
553 554
};

T
Thierry Reding 已提交
555
static const struct sdhci_tegra_soc_data soc_data_tegra114 = {
556
	.pdata = &sdhci_tegra114_pdata,
557 558
};

559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
static const struct sdhci_pltfm_data sdhci_tegra124_pdata = {
	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
		  SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
		  SDHCI_QUIRK_NO_HISPD_BIT |
		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC |
		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
		   /*
		    * The TRM states that the SD/MMC controller found on
		    * Tegra124 can address 34 bits (the maximum supported by
		    * the Tegra memory controller), but tests show that DMA
		    * to or from above 4 GiB doesn't work. This is possibly
		    * caused by missing programming, though it's not obvious
		    * what sequence is required. Mark 64-bit DMA broken for
		    * now to fix this for existing users (e.g. Nyan boards).
		    */
		   SDHCI_QUIRK2_BROKEN_64_BIT_DMA,
	.ops  = &tegra114_sdhci_ops,
};

static const struct sdhci_tegra_soc_data soc_data_tegra124 = {
	.pdata = &sdhci_tegra124_pdata,
};

T
Thierry Reding 已提交
584 585 586 587 588
static const struct sdhci_pltfm_data sdhci_tegra210_pdata = {
	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
		  SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
		  SDHCI_QUIRK_NO_HISPD_BIT |
589 590 591
		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC |
		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
T
Thierry Reding 已提交
592 593 594 595 596
	.ops  = &tegra114_sdhci_ops,
};

static const struct sdhci_tegra_soc_data soc_data_tegra210 = {
	.pdata = &sdhci_tegra210_pdata,
597
	.nvquirks = NVQUIRK_NEEDS_PAD_CONTROL,
T
Thierry Reding 已提交
598 599
};

600 601 602 603 604 605 606
static const struct sdhci_pltfm_data sdhci_tegra186_pdata = {
	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
		  SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
		  SDHCI_QUIRK_NO_HISPD_BIT |
		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC |
		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
607 608 609 610 611 612 613 614 615
	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
		   /* SDHCI controllers on Tegra186 support 40-bit addressing.
		    * IOVA addresses are 48-bit wide on Tegra186.
		    * With 64-bit dma mask used for SDHCI, accesses can
		    * be broken. Disable 64-bit dma, which would fall back
		    * to 32-bit dma mask. Ideally 40-bit dma mask would work,
		    * But it is not supported as of now.
		    */
		   SDHCI_QUIRK2_BROKEN_64_BIT_DMA,
616 617 618 619 620
	.ops  = &tegra114_sdhci_ops,
};

static const struct sdhci_tegra_soc_data soc_data_tegra186 = {
	.pdata = &sdhci_tegra186_pdata,
621
	.nvquirks = NVQUIRK_NEEDS_PAD_CONTROL,
622 623
};

B
Bill Pemberton 已提交
624
static const struct of_device_id sdhci_tegra_dt_match[] = {
625
	{ .compatible = "nvidia,tegra186-sdhci", .data = &soc_data_tegra186 },
T
Thierry Reding 已提交
626
	{ .compatible = "nvidia,tegra210-sdhci", .data = &soc_data_tegra210 },
627
	{ .compatible = "nvidia,tegra124-sdhci", .data = &soc_data_tegra124 },
628
	{ .compatible = "nvidia,tegra114-sdhci", .data = &soc_data_tegra114 },
629 630
	{ .compatible = "nvidia,tegra30-sdhci", .data = &soc_data_tegra30 },
	{ .compatible = "nvidia,tegra20-sdhci", .data = &soc_data_tegra20 },
631 632
	{}
};
633
MODULE_DEVICE_TABLE(of, sdhci_tegra_dt_match);
634

B
Bill Pemberton 已提交
635
static int sdhci_tegra_probe(struct platform_device *pdev)
636
{
637 638 639
	const struct of_device_id *match;
	const struct sdhci_tegra_soc_data *soc_data;
	struct sdhci_host *host;
640
	struct sdhci_pltfm_host *pltfm_host;
641
	struct sdhci_tegra *tegra_host;
642 643 644
	struct clk *clk;
	int rc;

645
	match = of_match_device(sdhci_tegra_dt_match, &pdev->dev);
646 647 648
	if (!match)
		return -EINVAL;
	soc_data = match->data;
649

650
	host = sdhci_pltfm_init(pdev, soc_data->pdata, sizeof(*tegra_host));
651 652 653 654
	if (IS_ERR(host))
		return PTR_ERR(host);
	pltfm_host = sdhci_priv(host);

655
	tegra_host = sdhci_pltfm_priv(pltfm_host);
656
	tegra_host->ddr_signaling = false;
657
	tegra_host->pad_calib_required = false;
658
	tegra_host->pad_control_available = false;
659
	tegra_host->soc_data = soc_data;
660

661 662 663 664 665 666 667
	if (soc_data->nvquirks & NVQUIRK_NEEDS_PAD_CONTROL) {
		rc = tegra_sdhci_init_pinctrl_info(&pdev->dev, tegra_host);
		if (rc == 0)
			host->mmc_host_ops.start_signal_voltage_switch =
				sdhci_tegra_start_signal_voltage_switch;
	}

668
	rc = mmc_of_parse(host->mmc);
669 670
	if (rc)
		goto err_parse_dt;
671

L
Lucas Stach 已提交
672
	if (tegra_host->soc_data->nvquirks & NVQUIRK_ENABLE_DDR50)
L
Lucas Stach 已提交
673 674
		host->mmc->caps |= MMC_CAP_1_8V_DDR;

675 676 677 678 679
	tegra_host->power_gpio = devm_gpiod_get_optional(&pdev->dev, "power",
							 GPIOD_OUT_HIGH);
	if (IS_ERR(tegra_host->power_gpio)) {
		rc = PTR_ERR(tegra_host->power_gpio);
		goto err_power_req;
680 681
	}

682
	clk = devm_clk_get(mmc_dev(host->mmc), NULL);
683 684 685
	if (IS_ERR(clk)) {
		dev_err(mmc_dev(host->mmc), "clk err\n");
		rc = PTR_ERR(clk);
686
		goto err_clk_get;
687
	}
688
	clk_prepare_enable(clk);
689 690
	pltfm_host->clk = clk;

691 692
	tegra_host->rst = devm_reset_control_get_exclusive(&pdev->dev,
							   "sdhci");
693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
	if (IS_ERR(tegra_host->rst)) {
		rc = PTR_ERR(tegra_host->rst);
		dev_err(&pdev->dev, "failed to get reset control: %d\n", rc);
		goto err_rst_get;
	}

	rc = reset_control_assert(tegra_host->rst);
	if (rc)
		goto err_rst_get;

	usleep_range(2000, 4000);

	rc = reset_control_deassert(tegra_host->rst);
	if (rc)
		goto err_rst_get;

	usleep_range(2000, 4000);

711 712 713 714
	rc = sdhci_add_host(host);
	if (rc)
		goto err_add_host;

715 716
	return 0;

717
err_add_host:
718 719
	reset_control_assert(tegra_host->rst);
err_rst_get:
720
	clk_disable_unprepare(pltfm_host->clk);
721 722
err_clk_get:
err_power_req:
723
err_parse_dt:
724
	sdhci_pltfm_free(pdev);
725 726 727
	return rc;
}

728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744
static int sdhci_tegra_remove(struct platform_device *pdev)
{
	struct sdhci_host *host = platform_get_drvdata(pdev);
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);

	sdhci_remove_host(host, 0);

	reset_control_assert(tegra_host->rst);
	usleep_range(2000, 4000);
	clk_disable_unprepare(pltfm_host->clk);

	sdhci_pltfm_free(pdev);

	return 0;
}

745 746 747
static struct platform_driver sdhci_tegra_driver = {
	.driver		= {
		.name	= "sdhci-tegra",
748
		.of_match_table = sdhci_tegra_dt_match,
749
		.pm	= &sdhci_pltfm_pmops,
750 751
	},
	.probe		= sdhci_tegra_probe,
752
	.remove		= sdhci_tegra_remove,
753 754
};

755
module_platform_driver(sdhci_tegra_driver);
756 757

MODULE_DESCRIPTION("SDHCI driver for Tegra");
758
MODULE_AUTHOR("Google, Inc.");
759
MODULE_LICENSE("GPL v2");