Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * Freescale eSDHC controller driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  * Copyright (c) 2007, 2010, 2012 Freescale Semiconductor, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  * Copyright (c) 2009 MontaVista Software, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  * Copyright 2020 NXP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9)  * Authors: Xiaobo Xie <X.Xie@freescale.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10)  *	    Anton Vorontsov <avorontsov@ru.mvista.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #include <linux/of_address.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) #include <linux/sys_soc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #include <linux/clk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #include <linux/ktime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) #include <linux/dma-mapping.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) #include <linux/iopoll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) #include <linux/mmc/host.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) #include <linux/mmc/mmc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) #include "sdhci-pltfm.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) #include "sdhci-esdhc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) #define VENDOR_V_22	0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) #define VENDOR_V_23	0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) #define MMC_TIMING_NUM (MMC_TIMING_MMC_HS400 + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) struct esdhc_clk_fixup {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) 	const unsigned int sd_dflt_max_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) 	const unsigned int max_clk[MMC_TIMING_NUM];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) static const struct esdhc_clk_fixup ls1021a_esdhc_clk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) 	.sd_dflt_max_clk = 25000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) 	.max_clk[MMC_TIMING_MMC_HS] = 46500000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) 	.max_clk[MMC_TIMING_SD_HS] = 46500000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) static const struct esdhc_clk_fixup ls1046a_esdhc_clk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) 	.sd_dflt_max_clk = 25000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) 	.max_clk[MMC_TIMING_UHS_SDR104] = 167000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) 	.max_clk[MMC_TIMING_MMC_HS200] = 167000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) static const struct esdhc_clk_fixup ls1012a_esdhc_clk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) 	.sd_dflt_max_clk = 25000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) 	.max_clk[MMC_TIMING_UHS_SDR104] = 125000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 	.max_clk[MMC_TIMING_MMC_HS200] = 125000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) static const struct esdhc_clk_fixup p1010_esdhc_clk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) 	.sd_dflt_max_clk = 20000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 	.max_clk[MMC_TIMING_LEGACY] = 20000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 	.max_clk[MMC_TIMING_MMC_HS] = 42000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	.max_clk[MMC_TIMING_SD_HS] = 40000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) static const struct of_device_id sdhci_esdhc_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 	{ .compatible = "fsl,ls1021a-esdhc", .data = &ls1021a_esdhc_clk},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 	{ .compatible = "fsl,ls1046a-esdhc", .data = &ls1046a_esdhc_clk},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 	{ .compatible = "fsl,ls1012a-esdhc", .data = &ls1012a_esdhc_clk},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 	{ .compatible = "fsl,p1010-esdhc",   .data = &p1010_esdhc_clk},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 	{ .compatible = "fsl,mpc8379-esdhc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 	{ .compatible = "fsl,mpc8536-esdhc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 	{ .compatible = "fsl,esdhc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 	{ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) MODULE_DEVICE_TABLE(of, sdhci_esdhc_of_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) struct sdhci_esdhc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 	u8 vendor_ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 	u8 spec_ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 	bool quirk_incorrect_hostver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 	bool quirk_limited_clk_division;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 	bool quirk_unreliable_pulse_detection;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 	bool quirk_tuning_erratum_type1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 	bool quirk_tuning_erratum_type2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	bool quirk_ignore_data_inhibit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 	bool quirk_delay_before_data_reset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 	bool quirk_trans_complete_erratum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 	bool in_sw_tuning;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 	unsigned int peripheral_clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 	const struct esdhc_clk_fixup *clk_fixup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) 	u32 div_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94)  * esdhc_read*_fixup - Fixup the value read from incompatible eSDHC register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95)  *		       to make it compatible with SD spec.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97)  * @host: pointer to sdhci_host
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98)  * @spec_reg: SD spec register address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99)  * @value: 32bit eSDHC register value on spec_reg address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101)  * In SD spec, there are 8/16/32/64 bits registers, while all of eSDHC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102)  * registers are 32 bits. There are differences in register size, register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103)  * address, register function, bit position and function between eSDHC spec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104)  * and SD spec.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106)  * Return a fixed up register value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) static u32 esdhc_readl_fixup(struct sdhci_host *host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 				     int spec_reg, u32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 	u32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) 	 * The bit of ADMA flag in eSDHC is not compatible with standard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 	 * SDHC register, so set fake flag SDHCI_CAN_DO_ADMA2 when ADMA is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 	 * supported by eSDHC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 	 * And for many FSL eSDHC controller, the reset value of field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 	 * SDHCI_CAN_DO_ADMA1 is 1, but some of them can't support ADMA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 	 * only these vendor version is greater than 2.2/0x12 support ADMA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) 	if ((spec_reg == SDHCI_CAPABILITIES) && (value & SDHCI_CAN_DO_ADMA1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 		if (esdhc->vendor_ver > VENDOR_V_22) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 			ret = value | SDHCI_CAN_DO_ADMA2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 	 * The DAT[3:0] line signal levels and the CMD line signal level are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) 	 * not compatible with standard SDHC register. The line signal levels
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 	 * DAT[7:0] are at bits 31:24 and the command line signal level is at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 	 * bit 23. All other bits are the same as in the standard SDHC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) 	 * register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 	if (spec_reg == SDHCI_PRESENT_STATE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 		ret = value & 0x000fffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 		ret |= (value >> 4) & SDHCI_DATA_LVL_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 		ret |= (value << 1) & SDHCI_CMD_LVL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 	 * DTS properties of mmc host are used to enable each speed mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 	 * according to soc and board capability. So clean up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 	 * SDR50/SDR104/DDR50 support bits here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 	if (spec_reg == SDHCI_CAPABILITIES_1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 		ret = value & ~(SDHCI_SUPPORT_SDR50 | SDHCI_SUPPORT_SDR104 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 				SDHCI_SUPPORT_DDR50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 	 * Some controllers have unreliable Data Line Active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 	 * bit for commands with busy signal. This affects
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 	 * Command Inhibit (data) bit. Just ignore it since
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 	 * MMC core driver has already polled card status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 	 * with CMD13 after any command with busy siganl.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 	if ((spec_reg == SDHCI_PRESENT_STATE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 	(esdhc->quirk_ignore_data_inhibit == true)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 		ret = value & ~SDHCI_DATA_INHIBIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 	ret = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) static u16 esdhc_readw_fixup(struct sdhci_host *host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 				     int spec_reg, u32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 	u16 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	int shift = (spec_reg & 0x2) * 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 	if (spec_reg == SDHCI_TRANSFER_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 		return pltfm_host->xfer_mode_shadow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 	if (spec_reg == SDHCI_HOST_VERSION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 		ret = value & 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 		ret = (value >> shift) & 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 	/* Workaround for T4240-R1.0-R2.0 eSDHC which has incorrect
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 	 * vendor version and spec version information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 	if ((spec_reg == SDHCI_HOST_VERSION) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 	    (esdhc->quirk_incorrect_hostver))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 		ret = (VENDOR_V_23 << SDHCI_VENDOR_VER_SHIFT) | SDHCI_SPEC_200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) static u8 esdhc_readb_fixup(struct sdhci_host *host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 				     int spec_reg, u32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	u8 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 	u8 dma_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 	int shift = (spec_reg & 0x3) * 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 	ret = (value >> shift) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 	 * "DMA select" locates at offset 0x28 in SD specification, but on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 	 * P5020 or P3041, it locates at 0x29.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 	if (spec_reg == SDHCI_HOST_CONTROL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 		/* DMA select is 22,23 bits in Protocol Control Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 		dma_bits = (value >> 5) & SDHCI_CTRL_DMA_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 		/* fixup the result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) 		ret &= ~SDHCI_CTRL_DMA_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 		ret |= dma_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219)  * esdhc_write*_fixup - Fixup the SD spec register value so that it could be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220)  *			written into eSDHC register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222)  * @host: pointer to sdhci_host
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223)  * @spec_reg: SD spec register address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224)  * @value: 8/16/32bit SD spec register value that would be written
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225)  * @old_value: 32bit eSDHC register value on spec_reg address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227)  * In SD spec, there are 8/16/32/64 bits registers, while all of eSDHC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228)  * registers are 32 bits. There are differences in register size, register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229)  * address, register function, bit position and function between eSDHC spec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230)  * and SD spec.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232)  * Return a fixed up register value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) static u32 esdhc_writel_fixup(struct sdhci_host *host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 				     int spec_reg, u32 value, u32 old_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 	u32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 	 * Enabling IRQSTATEN[BGESEN] is just to set IRQSTAT[BGE]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 	 * when SYSCTL[RSTD] is set for some special operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 	 * No any impact on other operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) 	if (spec_reg == SDHCI_INT_ENABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 		ret = value | SDHCI_INT_BLK_GAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 		ret = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) static u32 esdhc_writew_fixup(struct sdhci_host *host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 				     int spec_reg, u16 value, u32 old_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 	int shift = (spec_reg & 0x2) * 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 	u32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 	switch (spec_reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 	case SDHCI_TRANSFER_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 		 * Postpone this write, we must do it together with a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 		 * command write that is down below. Return old value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 		pltfm_host->xfer_mode_shadow = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 		return old_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 	case SDHCI_COMMAND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 		ret = (value << 16) | pltfm_host->xfer_mode_shadow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 	ret = old_value & (~(0xffff << shift));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	ret |= (value << shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 	if (spec_reg == SDHCI_BLOCK_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 		 * Two last DMA bits are reserved, and first one is used for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 		 * non-standard blksz of 4096 bytes that we don't support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 		 * yet. So clear the DMA boundary bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 		ret &= (~SDHCI_MAKE_BLKSZ(0x7, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) static u32 esdhc_writeb_fixup(struct sdhci_host *host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 				     int spec_reg, u8 value, u32 old_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 	u32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	u32 dma_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	u8 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 	int shift = (spec_reg & 0x3) * 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 	 * eSDHC doesn't have a standard power control register, so we do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 	 * nothing here to avoid incorrect operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 	if (spec_reg == SDHCI_POWER_CONTROL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 		return old_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 	 * "DMA select" location is offset 0x28 in SD specification, but on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 	 * P5020 or P3041, it's located at 0x29.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	if (spec_reg == SDHCI_HOST_CONTROL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 		 * If host control register is not standard, exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 		 * this function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 		if (host->quirks2 & SDHCI_QUIRK2_BROKEN_HOST_CONTROL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 			return old_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 		/* DMA select is 22,23 bits in Protocol Control Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 		dma_bits = (value & SDHCI_CTRL_DMA_MASK) << 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 		ret = (old_value & (~(SDHCI_CTRL_DMA_MASK << 5))) | dma_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 		tmp = (value & (~SDHCI_CTRL_DMA_MASK)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 		      (old_value & SDHCI_CTRL_DMA_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 		ret = (ret & (~0xff)) | tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 		/* Prevent SDHCI core from writing reserved bits (e.g. HISPD) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 		ret &= ~ESDHC_HOST_CONTROL_RES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	ret = (old_value & (~(0xff << shift))) | (value << shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) static u32 esdhc_be_readl(struct sdhci_host *host, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 	u32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 	if (reg == SDHCI_CAPABILITIES_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 		value = ioread32be(host->ioaddr + ESDHC_CAPABILITIES_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 		value = ioread32be(host->ioaddr + reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 	ret = esdhc_readl_fixup(host, reg, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) static u32 esdhc_le_readl(struct sdhci_host *host, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 	u32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 	if (reg == SDHCI_CAPABILITIES_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 		value = ioread32(host->ioaddr + ESDHC_CAPABILITIES_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 		value = ioread32(host->ioaddr + reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 	ret = esdhc_readl_fixup(host, reg, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) static u16 esdhc_be_readw(struct sdhci_host *host, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	u16 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 	int base = reg & ~0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 	value = ioread32be(host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 	ret = esdhc_readw_fixup(host, reg, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) static u16 esdhc_le_readw(struct sdhci_host *host, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 	u16 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 	int base = reg & ~0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 	value = ioread32(host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 	ret = esdhc_readw_fixup(host, reg, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) static u8 esdhc_be_readb(struct sdhci_host *host, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 	u8 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 	int base = reg & ~0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 	value = ioread32be(host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 	ret = esdhc_readb_fixup(host, reg, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) static u8 esdhc_le_readb(struct sdhci_host *host, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 	u8 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	int base = reg & ~0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 	value = ioread32(host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	ret = esdhc_readb_fixup(host, reg, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) static void esdhc_be_writel(struct sdhci_host *host, u32 val, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 	value = esdhc_writel_fixup(host, reg, val, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 	iowrite32be(value, host->ioaddr + reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) static void esdhc_le_writel(struct sdhci_host *host, u32 val, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 	value = esdhc_writel_fixup(host, reg, val, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 	iowrite32(value, host->ioaddr + reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) static void esdhc_be_writew(struct sdhci_host *host, u16 val, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	int base = reg & ~0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 	u32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 	value = ioread32be(host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 	ret = esdhc_writew_fixup(host, reg, val, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	if (reg != SDHCI_TRANSFER_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 		iowrite32be(ret, host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	/* Starting SW tuning requires ESDHC_SMPCLKSEL to be set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 	 * 1us later after ESDHC_EXTN is set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 	if (base == ESDHC_SYSTEM_CONTROL_2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 		if (!(value & ESDHC_EXTN) && (ret & ESDHC_EXTN) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 		    esdhc->in_sw_tuning) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 			udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 			ret |= ESDHC_SMPCLKSEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 			iowrite32be(ret, host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) static void esdhc_le_writew(struct sdhci_host *host, u16 val, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	int base = reg & ~0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 	u32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 	value = ioread32(host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 	ret = esdhc_writew_fixup(host, reg, val, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 	if (reg != SDHCI_TRANSFER_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 		iowrite32(ret, host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	/* Starting SW tuning requires ESDHC_SMPCLKSEL to be set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 	 * 1us later after ESDHC_EXTN is set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 	if (base == ESDHC_SYSTEM_CONTROL_2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 		if (!(value & ESDHC_EXTN) && (ret & ESDHC_EXTN) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 		    esdhc->in_sw_tuning) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 			udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 			ret |= ESDHC_SMPCLKSEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 			iowrite32(ret, host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) static void esdhc_be_writeb(struct sdhci_host *host, u8 val, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 	int base = reg & ~0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 	u32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	value = ioread32be(host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 	ret = esdhc_writeb_fixup(host, reg, val, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	iowrite32be(ret, host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) static void esdhc_le_writeb(struct sdhci_host *host, u8 val, int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	int base = reg & ~0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	u32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	value = ioread32(host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 	ret = esdhc_writeb_fixup(host, reg, val, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	iowrite32(ret, host->ioaddr + base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493)  * For Abort or Suspend after Stop at Block Gap, ignore the ADMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494)  * error(IRQSTAT[ADMAE]) if both Transfer Complete(IRQSTAT[TC])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495)  * and Block Gap Event(IRQSTAT[BGE]) are also set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496)  * For Continue, apply soft reset for data(SYSCTL[RSTD]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497)  * and re-issue the entire read transaction from beginning.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) static void esdhc_of_adma_workaround(struct sdhci_host *host, u32 intmask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	bool applicable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 	dma_addr_t dmastart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 	dma_addr_t dmanow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 	applicable = (intmask & SDHCI_INT_DATA_END) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 		     (intmask & SDHCI_INT_BLK_GAP) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 		     (esdhc->vendor_ver == VENDOR_V_23);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 	if (!applicable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 	host->data->error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	dmastart = sg_dma_address(host->data->sg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	dmanow = dmastart + host->data->bytes_xfered;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 	 * Force update to the next DMA block boundary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 	dmanow = (dmanow & ~(SDHCI_DEFAULT_BOUNDARY_SIZE - 1)) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 		SDHCI_DEFAULT_BOUNDARY_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 	host->data->bytes_xfered = dmanow - dmastart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 	sdhci_writel(host, dmanow, SDHCI_DMA_ADDRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) static int esdhc_of_enable_dma(struct sdhci_host *host)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 	struct device *dev = mmc_dev(host->mmc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 	if (of_device_is_compatible(dev->of_node, "fsl,ls1043a-esdhc") ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 	    of_device_is_compatible(dev->of_node, "fsl,ls1046a-esdhc")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 		ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(40));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 	value = sdhci_readl(host, ESDHC_DMA_SYSCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 	if (of_dma_is_coherent(dev->of_node))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 		value |= ESDHC_DMA_SNOOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 		value &= ~ESDHC_DMA_SNOOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 	sdhci_writel(host, value, ESDHC_DMA_SYSCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) static unsigned int esdhc_of_get_max_clock(struct sdhci_host *host)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 	if (esdhc->peripheral_clock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 		return esdhc->peripheral_clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 		return pltfm_host->clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) static unsigned int esdhc_of_get_min_clock(struct sdhci_host *host)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 	unsigned int clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 	if (esdhc->peripheral_clock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 		clock = esdhc->peripheral_clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 		clock = pltfm_host->clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 	return clock / 256 / 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) static void esdhc_clock_enable(struct sdhci_host *host, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 	ktime_t timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 	u32 val, clk_en;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 	clk_en = ESDHC_CLOCK_SDCLKEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 	 * IPGEN/HCKEN/PEREN bits exist on eSDHC whose vendor version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 	 * is 2.2 or lower.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 	if (esdhc->vendor_ver <= VENDOR_V_22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 		clk_en |= (ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 			   ESDHC_CLOCK_PEREN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 	val = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 	if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 		val |= clk_en;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 		val &= ~clk_en;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 	sdhci_writel(host, val, ESDHC_SYSTEM_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 	 * Wait max 20 ms. If vendor version is 2.2 or lower, do not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 	 * wait clock stable bit which does not exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	timeout = ktime_add_ms(ktime_get(), 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	while (esdhc->vendor_ver > VENDOR_V_22) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 		bool timedout = ktime_after(ktime_get(), timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 		if (sdhci_readl(host, ESDHC_PRSSTAT) & ESDHC_CLOCK_STABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 		if (timedout) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 			pr_err("%s: Internal clock never stabilised.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 				mmc_hostname(host->mmc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 		usleep_range(10, 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) static void esdhc_flush_async_fifo(struct sdhci_host *host)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 	ktime_t timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 	val = sdhci_readl(host, ESDHC_DMA_SYSCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 	val |= ESDHC_FLUSH_ASYNC_FIFO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	sdhci_writel(host, val, ESDHC_DMA_SYSCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	/* Wait max 20 ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 	timeout = ktime_add_ms(ktime_get(), 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 	while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 		bool timedout = ktime_after(ktime_get(), timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 		if (!(sdhci_readl(host, ESDHC_DMA_SYSCTL) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 		      ESDHC_FLUSH_ASYNC_FIFO))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 		if (timedout) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 			pr_err("%s: flushing asynchronous FIFO timeout.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 				mmc_hostname(host->mmc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 		usleep_range(10, 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) static void esdhc_of_set_clock(struct sdhci_host *host, unsigned int clock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	unsigned int pre_div = 1, div = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	unsigned int clock_fixup = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	ktime_t timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	u32 temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 	if (clock == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 		host->mmc->actual_clock = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 		esdhc_clock_enable(host, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 	/* Start pre_div at 2 for vendor version < 2.3. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 	if (esdhc->vendor_ver < VENDOR_V_23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 		pre_div = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	/* Fix clock value. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 	if (host->mmc->card && mmc_card_sd(host->mmc->card) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 	    esdhc->clk_fixup && host->mmc->ios.timing == MMC_TIMING_LEGACY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 		clock_fixup = esdhc->clk_fixup->sd_dflt_max_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 	else if (esdhc->clk_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 		clock_fixup = esdhc->clk_fixup->max_clk[host->mmc->ios.timing];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 	if (clock_fixup == 0 || clock < clock_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 		clock_fixup = clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 	/* Calculate pre_div and div. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 	while (host->max_clk / pre_div / 16 > clock_fixup && pre_div < 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 		pre_div *= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 	while (host->max_clk / pre_div / div > clock_fixup && div < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 		div++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 	esdhc->div_ratio = pre_div * div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 	/* Limit clock division for HS400 200MHz clock for quirk. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 	if (esdhc->quirk_limited_clk_division &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 	    clock == MMC_HS200_MAX_DTR &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 	    (host->mmc->ios.timing == MMC_TIMING_MMC_HS400 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 	     host->flags & SDHCI_HS400_TUNING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 		if (esdhc->div_ratio <= 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 			pre_div = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 			div = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 		} else if (esdhc->div_ratio <= 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 			pre_div = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 			div = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 		} else if (esdhc->div_ratio <= 12) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 			pre_div = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 			div = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 			pr_warn("%s: using unsupported clock division.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 				mmc_hostname(host->mmc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 		esdhc->div_ratio = pre_div * div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 	host->mmc->actual_clock = host->max_clk / esdhc->div_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 		clock, host->mmc->actual_clock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 	/* Set clock division into register. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 	pre_div >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 	div--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 	esdhc_clock_enable(host, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 	temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 	temp &= ~ESDHC_CLOCK_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 	temp |= ((div << ESDHC_DIVIDER_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 		(pre_div << ESDHC_PREDIV_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 	sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 	 * Wait max 20 ms. If vendor version is 2.2 or lower, do not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 	 * wait clock stable bit which does not exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 	timeout = ktime_add_ms(ktime_get(), 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 	while (esdhc->vendor_ver > VENDOR_V_22) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 		bool timedout = ktime_after(ktime_get(), timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 		if (sdhci_readl(host, ESDHC_PRSSTAT) & ESDHC_CLOCK_STABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 		if (timedout) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 			pr_err("%s: Internal clock never stabilised.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 				mmc_hostname(host->mmc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 		usleep_range(10, 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 	/* Additional setting for HS400. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 	if (host->mmc->ios.timing == MMC_TIMING_MMC_HS400 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 	    clock == MMC_HS200_MAX_DTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 		temp = sdhci_readl(host, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 		sdhci_writel(host, temp | ESDHC_HS400_MODE, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 		temp = sdhci_readl(host, ESDHC_SDCLKCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 		sdhci_writel(host, temp | ESDHC_CMD_CLK_CTL, ESDHC_SDCLKCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 		esdhc_clock_enable(host, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 		temp = sdhci_readl(host, ESDHC_DLLCFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 		temp |= ESDHC_DLL_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 		if (host->mmc->actual_clock == MMC_HS200_MAX_DTR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 			temp |= ESDHC_DLL_FREQ_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 		sdhci_writel(host, temp, ESDHC_DLLCFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 		temp |= ESDHC_DLL_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 		sdhci_writel(host, temp, ESDHC_DLLCFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 		udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 		temp &= ~ESDHC_DLL_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 		sdhci_writel(host, temp, ESDHC_DLLCFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 		/* Wait max 20 ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 		if (read_poll_timeout(sdhci_readl, temp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 				      temp & ESDHC_DLL_STS_SLV_LOCK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 				      10, 20000, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 				      host, ESDHC_DLLSTAT0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 			pr_err("%s: timeout for delay chain lock.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 			       mmc_hostname(host->mmc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 		temp = sdhci_readl(host, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 		sdhci_writel(host, temp | ESDHC_HS400_WNDW_ADJUST, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 		esdhc_clock_enable(host, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 		esdhc_flush_async_fifo(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 	esdhc_clock_enable(host, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) static void esdhc_pltfm_set_bus_width(struct sdhci_host *host, int width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 	u32 ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 	ctrl = sdhci_readl(host, ESDHC_PROCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 	ctrl &= (~ESDHC_CTRL_BUSWIDTH_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 	switch (width) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 	case MMC_BUS_WIDTH_8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 		ctrl |= ESDHC_CTRL_8BITBUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 	case MMC_BUS_WIDTH_4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 		ctrl |= ESDHC_CTRL_4BITBUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 	sdhci_writel(host, ctrl, ESDHC_PROCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) static void esdhc_reset(struct sdhci_host *host, u8 mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 	u32 val, bus_width = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 	 * Add delay to make sure all the DMA transfers are finished
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 	 * for quirk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 	if (esdhc->quirk_delay_before_data_reset &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 	    (mask & SDHCI_RESET_DATA) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 	    (host->flags & SDHCI_REQ_USE_DMA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 		mdelay(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 	 * Save bus-width for eSDHC whose vendor version is 2.2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 	 * or lower for data reset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 	if ((mask & SDHCI_RESET_DATA) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 	    (esdhc->vendor_ver <= VENDOR_V_22)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 		val = sdhci_readl(host, ESDHC_PROCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 		bus_width = val & ESDHC_CTRL_BUSWIDTH_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 	sdhci_reset(host, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 	 * Restore bus-width setting and interrupt registers for eSDHC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 	 * whose vendor version is 2.2 or lower for data reset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 	if ((mask & SDHCI_RESET_DATA) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 	    (esdhc->vendor_ver <= VENDOR_V_22)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 		val = sdhci_readl(host, ESDHC_PROCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 		val &= ~ESDHC_CTRL_BUSWIDTH_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 		val |= bus_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 		sdhci_writel(host, val, ESDHC_PROCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 		sdhci_writel(host, host->ier, SDHCI_INT_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 		sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 	 * Some bits have to be cleaned manually for eSDHC whose spec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 	 * version is higher than 3.0 for all reset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 	if ((mask & SDHCI_RESET_ALL) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 	    (esdhc->spec_ver >= SDHCI_SPEC_300)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 		val = sdhci_readl(host, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 		val &= ~ESDHC_TB_EN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 		sdhci_writel(host, val, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 		 * Initialize eSDHC_DLLCFG1[DLL_PD_PULSE_STRETCH_SEL] to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 		 * 0 for quirk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 		if (esdhc->quirk_unreliable_pulse_detection) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 			val = sdhci_readl(host, ESDHC_DLLCFG1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 			val &= ~ESDHC_DLL_PD_PULSE_STRETCH_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 			sdhci_writel(host, val, ESDHC_DLLCFG1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) /* The SCFG, Supplemental Configuration Unit, provides SoC specific
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863)  * configuration and status registers for the device. There is a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864)  * SDHC IO VSEL control register on SCFG for some platforms. It's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865)  * used to support SDHC IO voltage switching.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) static const struct of_device_id scfg_device_ids[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 	{ .compatible = "fsl,t1040-scfg", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 	{ .compatible = "fsl,ls1012a-scfg", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 	{ .compatible = "fsl,ls1046a-scfg", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 	{}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) /* SDHC IO VSEL control register definition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) #define SCFG_SDHCIOVSELCR	0x408
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) #define SDHCIOVSELCR_TGLEN	0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) #define SDHCIOVSELCR_VSELVAL	0x60000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) #define SDHCIOVSELCR_SDHC_VS	0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) static int esdhc_signal_voltage_switch(struct mmc_host *mmc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 				       struct mmc_ios *ios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 	struct sdhci_host *host = mmc_priv(mmc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 	struct device_node *scfg_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 	void __iomem *scfg_base = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 	u32 sdhciovselcr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 	 * Signal Voltage Switching is only applicable for Host Controllers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 	 * v3.00 and above.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 	if (host->version < SDHCI_SPEC_300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 	val = sdhci_readl(host, ESDHC_PROCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 	switch (ios->signal_voltage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 	case MMC_SIGNAL_VOLTAGE_330:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 		val &= ~ESDHC_VOLT_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 		sdhci_writel(host, val, ESDHC_PROCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 	case MMC_SIGNAL_VOLTAGE_180:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 		scfg_node = of_find_matching_node(NULL, scfg_device_ids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 		if (scfg_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 			scfg_base = of_iomap(scfg_node, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 		if (scfg_base) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 			sdhciovselcr = SDHCIOVSELCR_TGLEN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 				       SDHCIOVSELCR_VSELVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 			iowrite32be(sdhciovselcr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 				scfg_base + SCFG_SDHCIOVSELCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 			val |= ESDHC_VOLT_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 			sdhci_writel(host, val, ESDHC_PROCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 			mdelay(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 			sdhciovselcr = SDHCIOVSELCR_TGLEN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 				       SDHCIOVSELCR_SDHC_VS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 			iowrite32be(sdhciovselcr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 				scfg_base + SCFG_SDHCIOVSELCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 			iounmap(scfg_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 			val |= ESDHC_VOLT_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 			sdhci_writel(host, val, ESDHC_PROCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) static struct soc_device_attribute soc_tuning_erratum_type1[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	{ .family = "QorIQ T1023", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 	{ .family = "QorIQ T1040", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 	{ .family = "QorIQ T2080", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 	{ .family = "QorIQ LS1021A", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 	{ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) static struct soc_device_attribute soc_tuning_erratum_type2[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 	{ .family = "QorIQ LS1012A", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 	{ .family = "QorIQ LS1043A", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 	{ .family = "QorIQ LS1046A", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 	{ .family = "QorIQ LS1080A", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 	{ .family = "QorIQ LS2080A", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 	{ .family = "QorIQ LA1575A", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 	{ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) static void esdhc_tuning_block_enable(struct sdhci_host *host, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 	esdhc_clock_enable(host, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 	esdhc_flush_async_fifo(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 	val = sdhci_readl(host, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 	if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 		val |= ESDHC_TB_EN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 		val &= ~ESDHC_TB_EN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 	sdhci_writel(host, val, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 	esdhc_clock_enable(host, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) static void esdhc_tuning_window_ptr(struct sdhci_host *host, u8 *window_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 				    u8 *window_end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	/* Write TBCTL[11:8]=4'h8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 	val = sdhci_readl(host, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 	val &= ~(0xf << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 	val |= 8 << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 	sdhci_writel(host, val, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 	mdelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 	/* Read TBCTL[31:0] register and rewrite again */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 	val = sdhci_readl(host, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 	sdhci_writel(host, val, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 	mdelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 	/* Read the TBSTAT[31:0] register twice */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 	val = sdhci_readl(host, ESDHC_TBSTAT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 	val = sdhci_readl(host, ESDHC_TBSTAT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 	*window_end = val & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 	*window_start = (val >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) static void esdhc_prepare_sw_tuning(struct sdhci_host *host, u8 *window_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 				    u8 *window_end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 	u8 start_ptr, end_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 	if (esdhc->quirk_tuning_erratum_type1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 		*window_start = 5 * esdhc->div_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 		*window_end = 3 * esdhc->div_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 	esdhc_tuning_window_ptr(host, &start_ptr, &end_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 	/* Reset data lines by setting ESDHCCTL[RSTD] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 	sdhci_reset(host, SDHCI_RESET_DATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 	/* Write 32'hFFFF_FFFF to IRQSTAT register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 	sdhci_writel(host, 0xFFFFFFFF, SDHCI_INT_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 	/* If TBSTAT[15:8]-TBSTAT[7:0] > (4 * div_ratio) + 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	 * or TBSTAT[7:0]-TBSTAT[15:8] > (4 * div_ratio) + 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 	 * then program TBPTR[TB_WNDW_END_PTR] = 4 * div_ratio
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 	 * and program TBPTR[TB_WNDW_START_PTR] = 8 * div_ratio.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 	if (abs(start_ptr - end_ptr) > (4 * esdhc->div_ratio + 2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 		*window_start = 8 * esdhc->div_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 		*window_end = 4 * esdhc->div_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 		*window_start = 5 * esdhc->div_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 		*window_end = 3 * esdhc->div_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) static int esdhc_execute_sw_tuning(struct mmc_host *mmc, u32 opcode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 				   u8 window_start, u8 window_end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 	struct sdhci_host *host = mmc_priv(mmc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 	/* Program TBPTR[TB_WNDW_END_PTR] and TBPTR[TB_WNDW_START_PTR] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 	val = ((u32)window_start << ESDHC_WNDW_STRT_PTR_SHIFT) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	      ESDHC_WNDW_STRT_PTR_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 	val |= window_end & ESDHC_WNDW_END_PTR_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 	sdhci_writel(host, val, ESDHC_TBPTR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 	/* Program the software tuning mode by setting TBCTL[TB_MODE]=2'h3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 	val = sdhci_readl(host, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 	val &= ~ESDHC_TB_MODE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 	val |= ESDHC_TB_MODE_SW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	sdhci_writel(host, val, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 	esdhc->in_sw_tuning = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 	ret = sdhci_execute_tuning(mmc, opcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 	esdhc->in_sw_tuning = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) static int esdhc_execute_tuning(struct mmc_host *mmc, u32 opcode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 	struct sdhci_host *host = mmc_priv(mmc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 	u8 window_start, window_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 	int ret, retries = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 	bool hs400_tuning;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 	unsigned int clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 	/* For tuning mode, the sd clock divisor value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 	 * must be larger than 3 according to reference manual.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 	clk = esdhc->peripheral_clock / 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 	if (host->clock > clk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 		esdhc_of_set_clock(host, clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 	esdhc_tuning_block_enable(host, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 	 * The eSDHC controller takes the data timeout value into account
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 	 * during tuning. If the SD card is too slow sending the response, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 	 * timer will expire and a "Buffer Read Ready" interrupt without data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 	 * is triggered. This leads to tuning errors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 	 * Just set the timeout to the maximum value because the core will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 	 * already take care of it in sdhci_send_tuning().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 	sdhci_writeb(host, 0xe, SDHCI_TIMEOUT_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 	hs400_tuning = host->flags & SDHCI_HS400_TUNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 		if (esdhc->quirk_limited_clk_division &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 		    hs400_tuning)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 			esdhc_of_set_clock(host, host->clock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 		/* Do HW tuning */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 		val = sdhci_readl(host, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 		val &= ~ESDHC_TB_MODE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 		val |= ESDHC_TB_MODE_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 		sdhci_writel(host, val, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 		ret = sdhci_execute_tuning(mmc, opcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 		/* For type2 affected platforms of the tuning erratum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 		 * tuning may succeed although eSDHC might not have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 		 * tuned properly. Need to check tuning window.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 		if (esdhc->quirk_tuning_erratum_type2 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 		    !host->tuning_err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 			esdhc_tuning_window_ptr(host, &window_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 						&window_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 			if (abs(window_start - window_end) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 			    (4 * esdhc->div_ratio + 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 				host->tuning_err = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 		/* If HW tuning fails and triggers erratum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 		 * try workaround.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 		ret = host->tuning_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 		if (ret == -EAGAIN &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 		    (esdhc->quirk_tuning_erratum_type1 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 		     esdhc->quirk_tuning_erratum_type2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 			/* Recover HS400 tuning flag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 			if (hs400_tuning)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 				host->flags |= SDHCI_HS400_TUNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 			pr_info("%s: Hold on to use fixed sampling clock. Try SW tuning!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 				mmc_hostname(mmc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 			/* Do SW tuning */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 			esdhc_prepare_sw_tuning(host, &window_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 						&window_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 			ret = esdhc_execute_sw_tuning(mmc, opcode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 						      window_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 						      window_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 			if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 			/* Retry both HW/SW tuning with reduced clock. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 			ret = host->tuning_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 			if (ret == -EAGAIN && retries) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 				/* Recover HS400 tuning flag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 				if (hs400_tuning)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 					host->flags |= SDHCI_HS400_TUNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 				clk = host->max_clk / (esdhc->div_ratio + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 				esdhc_of_set_clock(host, clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 				pr_info("%s: Hold on to use fixed sampling clock. Try tuning with reduced clock!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 					mmc_hostname(mmc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 	} while (retries--);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 		esdhc_tuning_block_enable(host, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	} else if (hs400_tuning) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 		val = sdhci_readl(host, ESDHC_SDTIMNGCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 		val |= ESDHC_FLW_CTL_BG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 		sdhci_writel(host, val, ESDHC_SDTIMNGCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) static void esdhc_set_uhs_signaling(struct sdhci_host *host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 				   unsigned int timing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 	 * There are specific registers setting for HS400 mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 	 * Clean all of them if controller is in HS400 mode to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 	 * exit HS400 mode before re-setting any speed mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 	val = sdhci_readl(host, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 	if (val & ESDHC_HS400_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 		val = sdhci_readl(host, ESDHC_SDTIMNGCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 		val &= ~ESDHC_FLW_CTL_BG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 		sdhci_writel(host, val, ESDHC_SDTIMNGCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 		val = sdhci_readl(host, ESDHC_SDCLKCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 		val &= ~ESDHC_CMD_CLK_CTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 		sdhci_writel(host, val, ESDHC_SDCLKCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 		esdhc_clock_enable(host, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 		val = sdhci_readl(host, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 		val &= ~ESDHC_HS400_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 		sdhci_writel(host, val, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 		esdhc_clock_enable(host, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 		val = sdhci_readl(host, ESDHC_DLLCFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 		val &= ~(ESDHC_DLL_ENABLE | ESDHC_DLL_FREQ_SEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 		sdhci_writel(host, val, ESDHC_DLLCFG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 		val = sdhci_readl(host, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 		val &= ~ESDHC_HS400_WNDW_ADJUST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 		sdhci_writel(host, val, ESDHC_TBCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 		esdhc_tuning_block_enable(host, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 	if (timing == MMC_TIMING_MMC_HS400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 		esdhc_tuning_block_enable(host, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 		sdhci_set_uhs_signaling(host, timing);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) static u32 esdhc_irq(struct sdhci_host *host, u32 intmask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 	struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 	u32 command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 	if (esdhc->quirk_trans_complete_erratum) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 		command = SDHCI_GET_CMD(sdhci_readw(host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 					SDHCI_COMMAND));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 		if (command == MMC_WRITE_MULTIPLE_BLOCK &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 				sdhci_readw(host, SDHCI_BLOCK_COUNT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 				intmask & SDHCI_INT_DATA_END) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 			intmask &= ~SDHCI_INT_DATA_END;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 			sdhci_writel(host, SDHCI_INT_DATA_END,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 					SDHCI_INT_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 	return intmask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) #ifdef CONFIG_PM_SLEEP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) static u32 esdhc_proctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) static int esdhc_of_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 	struct sdhci_host *host = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 	esdhc_proctl = sdhci_readl(host, SDHCI_HOST_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 	if (host->tuning_mode != SDHCI_TUNING_MODE_3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 		mmc_retune_needed(host->mmc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 	return sdhci_suspend_host(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) static int esdhc_of_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 	struct sdhci_host *host = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 	int ret = sdhci_resume_host(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 	if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 		/* Isn't this already done by sdhci_resume_host() ? --rmk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 		esdhc_of_enable_dma(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 		sdhci_writel(host, esdhc_proctl, SDHCI_HOST_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) static SIMPLE_DEV_PM_OPS(esdhc_of_dev_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 			esdhc_of_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 			esdhc_of_resume);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) static const struct sdhci_ops sdhci_esdhc_be_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 	.read_l = esdhc_be_readl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	.read_w = esdhc_be_readw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 	.read_b = esdhc_be_readb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 	.write_l = esdhc_be_writel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 	.write_w = esdhc_be_writew,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 	.write_b = esdhc_be_writeb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 	.set_clock = esdhc_of_set_clock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 	.enable_dma = esdhc_of_enable_dma,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 	.get_max_clock = esdhc_of_get_max_clock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 	.get_min_clock = esdhc_of_get_min_clock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 	.adma_workaround = esdhc_of_adma_workaround,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 	.set_bus_width = esdhc_pltfm_set_bus_width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 	.reset = esdhc_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 	.set_uhs_signaling = esdhc_set_uhs_signaling,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 	.irq = esdhc_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) static const struct sdhci_ops sdhci_esdhc_le_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 	.read_l = esdhc_le_readl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 	.read_w = esdhc_le_readw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 	.read_b = esdhc_le_readb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 	.write_l = esdhc_le_writel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 	.write_w = esdhc_le_writew,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 	.write_b = esdhc_le_writeb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 	.set_clock = esdhc_of_set_clock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 	.enable_dma = esdhc_of_enable_dma,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 	.get_max_clock = esdhc_of_get_max_clock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 	.get_min_clock = esdhc_of_get_min_clock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 	.adma_workaround = esdhc_of_adma_workaround,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 	.set_bus_width = esdhc_pltfm_set_bus_width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 	.reset = esdhc_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 	.set_uhs_signaling = esdhc_set_uhs_signaling,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 	.irq = esdhc_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) static const struct sdhci_pltfm_data sdhci_esdhc_be_pdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 	.quirks = ESDHC_DEFAULT_QUIRKS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) #ifdef CONFIG_PPC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 		  SDHCI_QUIRK_BROKEN_CARD_DETECTION |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 		  SDHCI_QUIRK_NO_CARD_NO_RESET |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 		  SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 	.ops = &sdhci_esdhc_be_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) static const struct sdhci_pltfm_data sdhci_esdhc_le_pdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 	.quirks = ESDHC_DEFAULT_QUIRKS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 		  SDHCI_QUIRK_NO_CARD_NO_RESET |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 		  SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 	.ops = &sdhci_esdhc_le_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) static struct soc_device_attribute soc_incorrect_hostver[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 	{ .family = "QorIQ T4240", .revision = "1.0", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 	{ .family = "QorIQ T4240", .revision = "2.0", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 	{ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) static struct soc_device_attribute soc_fixup_sdhc_clkdivs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 	{ .family = "QorIQ LX2160A", .revision = "1.0", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 	{ .family = "QorIQ LX2160A", .revision = "2.0", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 	{ .family = "QorIQ LS1028A", .revision = "1.0", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 	{ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) static struct soc_device_attribute soc_unreliable_pulse_detection[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 	{ .family = "QorIQ LX2160A", .revision = "1.0", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 	{ .family = "QorIQ LX2160A", .revision = "2.0", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 	{ .family = "QorIQ LS1028A", .revision = "1.0", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 	{ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) static void esdhc_init(struct platform_device *pdev, struct sdhci_host *host)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 	const struct of_device_id *match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 	struct sdhci_pltfm_host *pltfm_host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 	struct sdhci_esdhc *esdhc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 	struct device_node *np;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 	struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 	u16 host_ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 	pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 	esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 	host_ver = sdhci_readw(host, SDHCI_HOST_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 	esdhc->vendor_ver = (host_ver & SDHCI_VENDOR_VER_MASK) >>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 			     SDHCI_VENDOR_VER_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 	esdhc->spec_ver = host_ver & SDHCI_SPEC_VER_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 	if (soc_device_match(soc_incorrect_hostver))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 		esdhc->quirk_incorrect_hostver = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 		esdhc->quirk_incorrect_hostver = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 	if (soc_device_match(soc_fixup_sdhc_clkdivs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 		esdhc->quirk_limited_clk_division = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 		esdhc->quirk_limited_clk_division = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 	if (soc_device_match(soc_unreliable_pulse_detection))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 		esdhc->quirk_unreliable_pulse_detection = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 		esdhc->quirk_unreliable_pulse_detection = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 	match = of_match_node(sdhci_esdhc_of_match, pdev->dev.of_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 	if (match)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 		esdhc->clk_fixup = match->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 	np = pdev->dev.of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 	if (of_device_is_compatible(np, "fsl,p2020-esdhc")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 		esdhc->quirk_delay_before_data_reset = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 		esdhc->quirk_trans_complete_erratum = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 	clk = of_clk_get(np, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 	if (!IS_ERR(clk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 		 * esdhc->peripheral_clock would be assigned with a value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 		 * which is eSDHC base clock when use periperal clock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 		 * For some platforms, the clock value got by common clk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 		 * API is peripheral clock while the eSDHC base clock is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 		 * 1/2 peripheral clock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 		if (of_device_is_compatible(np, "fsl,ls1046a-esdhc") ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 		    of_device_is_compatible(np, "fsl,ls1028a-esdhc") ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 		    of_device_is_compatible(np, "fsl,ls1088a-esdhc"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 			esdhc->peripheral_clock = clk_get_rate(clk) / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 			esdhc->peripheral_clock = clk_get_rate(clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 		clk_put(clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) 	esdhc_clock_enable(host, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 	val = sdhci_readl(host, ESDHC_DMA_SYSCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 	 * This bit is not able to be reset by SDHCI_RESET_ALL. Need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 	 * initialize it as 1 or 0 once, to override the different value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 	 * which may be configured in bootloader.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 	if (esdhc->peripheral_clock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 		val |= ESDHC_PERIPHERAL_CLK_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 		val &= ~ESDHC_PERIPHERAL_CLK_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 	sdhci_writel(host, val, ESDHC_DMA_SYSCTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 	esdhc_clock_enable(host, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) static int esdhc_hs400_prepare_ddr(struct mmc_host *mmc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 	esdhc_tuning_block_enable(mmc_priv(mmc), false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) static int sdhci_esdhc_probe(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 	struct sdhci_host *host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 	struct device_node *np;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 	struct sdhci_pltfm_host *pltfm_host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 	struct sdhci_esdhc *esdhc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 	np = pdev->dev.of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 	if (of_property_read_bool(np, "little-endian"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 		host = sdhci_pltfm_init(pdev, &sdhci_esdhc_le_pdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 					sizeof(struct sdhci_esdhc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 		host = sdhci_pltfm_init(pdev, &sdhci_esdhc_be_pdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 					sizeof(struct sdhci_esdhc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 	if (IS_ERR(host))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 		return PTR_ERR(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 	host->mmc_host_ops.start_signal_voltage_switch =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 		esdhc_signal_voltage_switch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 	host->mmc_host_ops.execute_tuning = esdhc_execute_tuning;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 	host->mmc_host_ops.hs400_prepare_ddr = esdhc_hs400_prepare_ddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 	host->tuning_delay = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 	esdhc_init(pdev, host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 	sdhci_get_of_property(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) 	pltfm_host = sdhci_priv(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 	esdhc = sdhci_pltfm_priv(pltfm_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 	if (soc_device_match(soc_tuning_erratum_type1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 		esdhc->quirk_tuning_erratum_type1 = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 		esdhc->quirk_tuning_erratum_type1 = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 	if (soc_device_match(soc_tuning_erratum_type2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 		esdhc->quirk_tuning_erratum_type2 = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 		esdhc->quirk_tuning_erratum_type2 = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 	if (esdhc->vendor_ver == VENDOR_V_22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 		host->quirks2 |= SDHCI_QUIRK2_HOST_NO_CMD23;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 	if (esdhc->vendor_ver > VENDOR_V_22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 		host->quirks &= ~SDHCI_QUIRK_NO_BUSY_IRQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 	if (of_find_compatible_node(NULL, NULL, "fsl,p2020-esdhc")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 		host->quirks |= SDHCI_QUIRK_RESET_AFTER_REQUEST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 		host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 	if (of_device_is_compatible(np, "fsl,p5040-esdhc") ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 	    of_device_is_compatible(np, "fsl,p5020-esdhc") ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 	    of_device_is_compatible(np, "fsl,p4080-esdhc") ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 	    of_device_is_compatible(np, "fsl,p1020-esdhc") ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 	    of_device_is_compatible(np, "fsl,t1040-esdhc"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 		host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 	if (of_device_is_compatible(np, "fsl,ls1021a-esdhc"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 		host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 	esdhc->quirk_ignore_data_inhibit = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 	if (of_device_is_compatible(np, "fsl,p2020-esdhc")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 		 * Freescale messed up with P2020 as it has a non-standard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 		 * host control register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 		host->quirks2 |= SDHCI_QUIRK2_BROKEN_HOST_CONTROL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 		esdhc->quirk_ignore_data_inhibit = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 	/* call to generic mmc_of_parse to support additional capabilities */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 	ret = mmc_of_parse(host->mmc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 		goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 	mmc_of_parse_voltage(np, &host->ocr_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 	ret = sdhci_add_host(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 		goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503)  err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 	sdhci_pltfm_free(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) static struct platform_driver sdhci_esdhc_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 	.driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 		.name = "sdhci-esdhc",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 		.of_match_table = sdhci_esdhc_of_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 		.pm = &esdhc_of_dev_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 	.probe = sdhci_esdhc_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) 	.remove = sdhci_pltfm_unregister,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) module_platform_driver(sdhci_esdhc_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) MODULE_DESCRIPTION("SDHCI OF driver for Freescale MPC eSDHC");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) MODULE_AUTHOR("Xiaobo Xie <X.Xie@freescale.com>, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) 	      "Anton Vorontsov <avorontsov@ru.mvista.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) MODULE_LICENSE("GPL v2");