sdhci-tegra.c 21.9 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 57 58 59 60 61 62 63 64 65 66 67 68
#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

#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)
69 70

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

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

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

88 89
static u16 tegra_sdhci_readw(struct sdhci_host *host, int reg)
{
90
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
91
	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
92 93 94 95
	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))) {
96 97 98 99 100 101 102
		/* Erratum: Version register is invalid in HW. */
		return SDHCI_SPEC_200;
	}

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

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

107 108 109 110 111 112 113 114 115 116 117 118
	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;
119 120 121 122 123
	}

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

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

130 131 132 133 134 135 136 137 138
	/* 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);

139 140
	if (unlikely((soc_data->nvquirks & NVQUIRK_ENABLE_BLOCK_GAP_DET) &&
			(reg == SDHCI_INT_ENABLE))) {
141 142 143 144 145 146 147 148 149 150
		/* 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);
	}
}

151
static unsigned int tegra_sdhci_get_ro(struct sdhci_host *host)
152
{
153
	return mmc_gpio_get_ro(host->mmc);
154 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
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;
}

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

196 197
	sdhci_reset(host, mask);

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

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

	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 已提交
209
	clk_ctrl &= ~SDHCI_CLOCK_CTRL_SPI_MODE_CLKEN_OVERRIDE;
210

211
	if (tegra_sdhci_is_pad_and_regulator_valid(host)) {
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
		/* 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 已提交
227 228
	sdhci_writel(host, clk_ctrl, SDHCI_TEGRA_VENDOR_CLOCK_CTRL);

229 230 231 232 233 234
	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);

235
		tegra_host->pad_calib_required = true;
236
	}
237

238
	tegra_host->ddr_signaling = false;
239 240
}

241 242
static void tegra_sdhci_pad_autocalib(struct sdhci_host *host)
{
243 244 245 246 247 248
	u32 reg;
	int ret;

	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);
249

250 251 252 253 254
	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);
255

256 257
	if (ret)
		dev_err(mmc_dev(host->mmc), "Pad autocal timed out\n");
258 259
}

260 261 262
static void tegra_sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
{
	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
263
	struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host);
264 265 266
	unsigned long host_clk;

	if (!clock)
267
		return sdhci_set_clock(host, clock);
268

269 270 271 272 273 274 275 276 277 278 279 280
	/*
	 * 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.
	 */
281 282
	host_clk = tegra_host->ddr_signaling ? clock * 2 : clock;
	clk_set_rate(pltfm_host->clk, host_clk);
283 284 285 286
	if (tegra_host->ddr_signaling)
		host->max_clk = host_clk;
	else
		host->max_clk = clk_get_rate(pltfm_host->clk);
287

288 289 290 291 292 293
	sdhci_set_clock(host, clock);

	if (tegra_host->pad_calib_required) {
		tegra_sdhci_pad_autocalib(host);
		tegra_host->pad_calib_required = false;
	}
294 295 296 297 298 299
}

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

S
Stefan Agner 已提交
302 303
	if (timing == MMC_TIMING_UHS_DDR50 ||
	    timing == MMC_TIMING_MMC_DDR52)
304 305
		tegra_host->ddr_signaling = true;

306
	sdhci_set_uhs_signaling(host, timing);
307 308
}

309 310 311 312 313 314 315
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 已提交
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
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);
}

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 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
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;
}

438 439 440 441 442 443 444 445 446 447
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;
}

448
static const struct sdhci_ops tegra_sdhci_ops = {
449 450 451
	.get_ro     = tegra_sdhci_get_ro,
	.read_w     = tegra_sdhci_readw,
	.write_l    = tegra_sdhci_writel,
452
	.set_clock  = tegra_sdhci_set_clock,
453
	.set_bus_width = sdhci_set_bus_width,
454
	.reset      = tegra_sdhci_reset,
L
Lucas Stach 已提交
455
	.platform_execute_tuning = tegra_sdhci_execute_tuning,
456
	.set_uhs_signaling = tegra_sdhci_set_uhs_signaling,
457
	.voltage_switch = tegra_sdhci_voltage_switch,
458
	.get_max_clock = tegra_sdhci_get_max_clock,
459 460
};

461
static const struct sdhci_pltfm_data sdhci_tegra20_pdata = {
462 463 464
	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
		  SDHCI_QUIRK_NO_HISPD_BIT |
465 466
		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC |
		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
467 468 469
	.ops  = &tegra_sdhci_ops,
};

T
Thierry Reding 已提交
470
static const struct sdhci_tegra_soc_data soc_data_tegra20 = {
471 472 473 474 475
	.pdata = &sdhci_tegra20_pdata,
	.nvquirks = NVQUIRK_FORCE_SDHCI_SPEC_200 |
		    NVQUIRK_ENABLE_BLOCK_GAP_DET,
};

476
static const struct sdhci_pltfm_data sdhci_tegra30_pdata = {
477
	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
478
		  SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
479 480
		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
		  SDHCI_QUIRK_NO_HISPD_BIT |
481 482
		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC |
		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
483
	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
484 485 486 487 488 489 490 491 492
		   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,
493 494
	.ops  = &tegra_sdhci_ops,
};
495

T
Thierry Reding 已提交
496
static const struct sdhci_tegra_soc_data soc_data_tegra30 = {
497
	.pdata = &sdhci_tegra30_pdata,
498
	.nvquirks = NVQUIRK_ENABLE_SDHCI_SPEC_300 |
L
Lucas Stach 已提交
499
		    NVQUIRK_ENABLE_SDR50 |
500 501
		    NVQUIRK_ENABLE_SDR104 |
		    NVQUIRK_HAS_PADCALIB,
502 503
};

504 505 506 507 508
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,
509
	.set_clock  = tegra_sdhci_set_clock,
510
	.set_bus_width = sdhci_set_bus_width,
511
	.reset      = tegra_sdhci_reset,
L
Lucas Stach 已提交
512
	.platform_execute_tuning = tegra_sdhci_execute_tuning,
513
	.set_uhs_signaling = tegra_sdhci_set_uhs_signaling,
514
	.voltage_switch = tegra_sdhci_voltage_switch,
515
	.get_max_clock = tegra_sdhci_get_max_clock,
516 517
};

518
static const struct sdhci_pltfm_data sdhci_tegra114_pdata = {
519 520 521 522
	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
		  SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
		  SDHCI_QUIRK_SINGLE_POWER_WRITE |
		  SDHCI_QUIRK_NO_HISPD_BIT |
523 524
		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC |
		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
525
	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
526
	.ops  = &tegra114_sdhci_ops,
527 528
};

T
Thierry Reding 已提交
529
static const struct sdhci_tegra_soc_data soc_data_tegra114 = {
530
	.pdata = &sdhci_tegra114_pdata,
531 532
};

533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557
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 已提交
558 559 560 561 562
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 |
563 564 565
		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC |
		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
T
Thierry Reding 已提交
566 567 568 569 570
	.ops  = &tegra114_sdhci_ops,
};

static const struct sdhci_tegra_soc_data soc_data_tegra210 = {
	.pdata = &sdhci_tegra210_pdata,
571
	.nvquirks = NVQUIRK_NEEDS_PAD_CONTROL,
T
Thierry Reding 已提交
572 573
};

574 575 576 577 578 579 580
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,
581 582 583 584 585 586 587 588 589
	.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,
590 591 592 593 594
	.ops  = &tegra114_sdhci_ops,
};

static const struct sdhci_tegra_soc_data soc_data_tegra186 = {
	.pdata = &sdhci_tegra186_pdata,
595
	.nvquirks = NVQUIRK_NEEDS_PAD_CONTROL,
596 597
};

B
Bill Pemberton 已提交
598
static const struct of_device_id sdhci_tegra_dt_match[] = {
599
	{ .compatible = "nvidia,tegra186-sdhci", .data = &soc_data_tegra186 },
T
Thierry Reding 已提交
600
	{ .compatible = "nvidia,tegra210-sdhci", .data = &soc_data_tegra210 },
601
	{ .compatible = "nvidia,tegra124-sdhci", .data = &soc_data_tegra124 },
602
	{ .compatible = "nvidia,tegra114-sdhci", .data = &soc_data_tegra114 },
603 604
	{ .compatible = "nvidia,tegra30-sdhci", .data = &soc_data_tegra30 },
	{ .compatible = "nvidia,tegra20-sdhci", .data = &soc_data_tegra20 },
605 606
	{}
};
607
MODULE_DEVICE_TABLE(of, sdhci_tegra_dt_match);
608

B
Bill Pemberton 已提交
609
static int sdhci_tegra_probe(struct platform_device *pdev)
610
{
611 612 613
	const struct of_device_id *match;
	const struct sdhci_tegra_soc_data *soc_data;
	struct sdhci_host *host;
614
	struct sdhci_pltfm_host *pltfm_host;
615
	struct sdhci_tegra *tegra_host;
616 617 618
	struct clk *clk;
	int rc;

619
	match = of_match_device(sdhci_tegra_dt_match, &pdev->dev);
620 621 622
	if (!match)
		return -EINVAL;
	soc_data = match->data;
623

624
	host = sdhci_pltfm_init(pdev, soc_data->pdata, sizeof(*tegra_host));
625 626 627 628
	if (IS_ERR(host))
		return PTR_ERR(host);
	pltfm_host = sdhci_priv(host);

629
	tegra_host = sdhci_pltfm_priv(pltfm_host);
630
	tegra_host->ddr_signaling = false;
631
	tegra_host->pad_calib_required = false;
632
	tegra_host->pad_control_available = false;
633
	tegra_host->soc_data = soc_data;
634

635 636 637 638 639 640 641
	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;
	}

642
	rc = mmc_of_parse(host->mmc);
643 644
	if (rc)
		goto err_parse_dt;
645

L
Lucas Stach 已提交
646
	if (tegra_host->soc_data->nvquirks & NVQUIRK_ENABLE_DDR50)
L
Lucas Stach 已提交
647 648
		host->mmc->caps |= MMC_CAP_1_8V_DDR;

649 650 651 652 653
	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;
654 655
	}

656
	clk = devm_clk_get(mmc_dev(host->mmc), NULL);
657 658 659
	if (IS_ERR(clk)) {
		dev_err(mmc_dev(host->mmc), "clk err\n");
		rc = PTR_ERR(clk);
660
		goto err_clk_get;
661
	}
662
	clk_prepare_enable(clk);
663 664
	pltfm_host->clk = clk;

665 666
	tegra_host->rst = devm_reset_control_get_exclusive(&pdev->dev,
							   "sdhci");
667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684
	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);

685 686 687 688
	rc = sdhci_add_host(host);
	if (rc)
		goto err_add_host;

689 690
	return 0;

691
err_add_host:
692 693
	reset_control_assert(tegra_host->rst);
err_rst_get:
694
	clk_disable_unprepare(pltfm_host->clk);
695 696
err_clk_get:
err_power_req:
697
err_parse_dt:
698
	sdhci_pltfm_free(pdev);
699 700 701
	return rc;
}

702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718
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;
}

719 720 721
static struct platform_driver sdhci_tegra_driver = {
	.driver		= {
		.name	= "sdhci-tegra",
722
		.of_match_table = sdhci_tegra_dt_match,
723
		.pm	= &sdhci_pltfm_pmops,
724 725
	},
	.probe		= sdhci_tegra_probe,
726
	.remove		= sdhci_tegra_remove,
727 728
};

729
module_platform_driver(sdhci_tegra_driver);
730 731

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