Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2019 Genesys Logic, Inc.
   4 *
   5 * Authors: Ben Chuang <ben.chuang@genesyslogic.com.tw>
   6 *
   7 * Version: v0.9.0 (2019-08-08)
   8 */
   9
  10#include <linux/bitfield.h>
  11#include <linux/bits.h>
  12#include <linux/pci.h>
  13#include <linux/mmc/mmc.h>
  14#include <linux/delay.h>
  15#include <linux/of.h>
  16#include <linux/iopoll.h>
  17#include "sdhci.h"
  18#include "sdhci-cqhci.h"
  19#include "sdhci-pci.h"
  20#include "cqhci.h"
  21
  22/*  Genesys Logic extra registers */
  23#define SDHCI_GLI_9750_WT         0x800
  24#define   SDHCI_GLI_9750_WT_EN      BIT(0)
  25#define   GLI_9750_WT_EN_ON	    0x1
  26#define   GLI_9750_WT_EN_OFF	    0x0
  27
  28#define SDHCI_GLI_9750_CFG2          0x848
  29#define   SDHCI_GLI_9750_CFG2_L1DLY    GENMASK(28, 24)
  30#define   GLI_9750_CFG2_L1DLY_VALUE    0x1F
  31
  32#define SDHCI_GLI_9750_DRIVING      0x860
  33#define   SDHCI_GLI_9750_DRIVING_1    GENMASK(11, 0)
  34#define   SDHCI_GLI_9750_DRIVING_2    GENMASK(27, 26)
  35#define   GLI_9750_DRIVING_1_VALUE    0xFFF
  36#define   GLI_9750_DRIVING_2_VALUE    0x3
  37#define   SDHCI_GLI_9750_SEL_1        BIT(29)
  38#define   SDHCI_GLI_9750_SEL_2        BIT(31)
  39#define   SDHCI_GLI_9750_ALL_RST      (BIT(24)|BIT(25)|BIT(28)|BIT(30))
  40
  41#define SDHCI_GLI_9750_PLL	      0x864
  42#define   SDHCI_GLI_9750_PLL_LDIV       GENMASK(9, 0)
  43#define   SDHCI_GLI_9750_PLL_PDIV       GENMASK(14, 12)
  44#define   SDHCI_GLI_9750_PLL_DIR        BIT(15)
  45#define   SDHCI_GLI_9750_PLL_TX2_INV    BIT(23)
  46#define   SDHCI_GLI_9750_PLL_TX2_DLY    GENMASK(22, 20)
  47#define   GLI_9750_PLL_TX2_INV_VALUE    0x1
  48#define   GLI_9750_PLL_TX2_DLY_VALUE    0x0
  49#define   SDHCI_GLI_9750_PLLSSC_STEP    GENMASK(28, 24)
  50#define   SDHCI_GLI_9750_PLLSSC_EN      BIT(31)
  51
  52#define SDHCI_GLI_9750_PLLSSC        0x86C
  53#define   SDHCI_GLI_9750_PLLSSC_PPM    GENMASK(31, 16)
  54
  55#define SDHCI_GLI_9750_SW_CTRL      0x874
  56#define   SDHCI_GLI_9750_SW_CTRL_4    GENMASK(7, 6)
  57#define   GLI_9750_SW_CTRL_4_VALUE    0x3
  58
  59#define SDHCI_GLI_9750_MISC            0x878
  60#define   SDHCI_GLI_9750_MISC_TX1_INV    BIT(2)
  61#define   SDHCI_GLI_9750_MISC_RX_INV     BIT(3)
  62#define   SDHCI_GLI_9750_MISC_TX1_DLY    GENMASK(6, 4)
  63#define   GLI_9750_MISC_TX1_INV_VALUE    0x0
  64#define   GLI_9750_MISC_RX_INV_ON        0x1
  65#define   GLI_9750_MISC_RX_INV_OFF       0x0
  66#define   GLI_9750_MISC_RX_INV_VALUE     GLI_9750_MISC_RX_INV_OFF
  67#define   GLI_9750_MISC_TX1_DLY_VALUE    0x5
  68#define   SDHCI_GLI_9750_MISC_SSC_OFF    BIT(26)
  69
  70#define SDHCI_GLI_9750_TUNING_CONTROL	          0x540
  71#define   SDHCI_GLI_9750_TUNING_CONTROL_EN          BIT(4)
  72#define   GLI_9750_TUNING_CONTROL_EN_ON             0x1
  73#define   GLI_9750_TUNING_CONTROL_EN_OFF            0x0
  74#define   SDHCI_GLI_9750_TUNING_CONTROL_GLITCH_1    BIT(16)
  75#define   SDHCI_GLI_9750_TUNING_CONTROL_GLITCH_2    GENMASK(20, 19)
  76#define   GLI_9750_TUNING_CONTROL_GLITCH_1_VALUE    0x1
  77#define   GLI_9750_TUNING_CONTROL_GLITCH_2_VALUE    0x2
  78
  79#define SDHCI_GLI_9750_TUNING_PARAMETERS           0x544
  80#define   SDHCI_GLI_9750_TUNING_PARAMETERS_RX_DLY    GENMASK(2, 0)
  81#define   GLI_9750_TUNING_PARAMETERS_RX_DLY_VALUE    0x1
  82
  83#define SDHCI_GLI_9763E_CTRL_HS400  0x7
  84
  85#define SDHCI_GLI_9763E_HS400_ES_REG      0x52C
  86#define   SDHCI_GLI_9763E_HS400_ES_BIT      BIT(8)
  87
  88#define PCIE_GLI_9763E_VHS	 0x884
  89#define   GLI_9763E_VHS_REV	   GENMASK(19, 16)
  90#define   GLI_9763E_VHS_REV_R      0x0
  91#define   GLI_9763E_VHS_REV_M      0x1
  92#define   GLI_9763E_VHS_REV_W      0x2
  93#define PCIE_GLI_9763E_MB	 0x888
  94#define   GLI_9763E_MB_CMDQ_OFF	   BIT(19)
  95#define   GLI_9763E_MB_ERP_ON      BIT(7)
  96#define PCIE_GLI_9763E_SCR	 0x8E0
  97#define   GLI_9763E_SCR_AXI_REQ	   BIT(9)
  98
  99#define PCIE_GLI_9763E_CFG       0x8A0
 100#define   GLI_9763E_CFG_LPSN_DIS   BIT(12)
 101
 102#define PCIE_GLI_9763E_CFG2      0x8A4
 103#define   GLI_9763E_CFG2_L1DLY     GENMASK(28, 19)
 104#define   GLI_9763E_CFG2_L1DLY_MID 0x54
 105
 106#define PCIE_GLI_9763E_MMC_CTRL  0x960
 107#define   GLI_9763E_HS400_SLOW     BIT(3)
 108
 109#define PCIE_GLI_9763E_CLKRXDLY  0x934
 110#define   GLI_9763E_HS400_RXDLY    GENMASK(31, 28)
 111#define   GLI_9763E_HS400_RXDLY_5  0x5
 112
 113#define SDHCI_GLI_9763E_CQE_BASE_ADDR	 0x200
 114#define GLI_9763E_CQE_TRNS_MODE	   (SDHCI_TRNS_MULTI | \
 115				    SDHCI_TRNS_BLK_CNT_EN | \
 116				    SDHCI_TRNS_DMA)
 117
 118#define PCI_GLI_9755_WT       0x800
 119#define   PCI_GLI_9755_WT_EN    BIT(0)
 120#define   GLI_9755_WT_EN_ON     0x1
 121#define   GLI_9755_WT_EN_OFF    0x0
 122
 123#define PCI_GLI_9755_PECONF   0x44
 124#define   PCI_GLI_9755_LFCLK    GENMASK(14, 12)
 125#define   PCI_GLI_9755_DMACLK   BIT(29)
 126#define   PCI_GLI_9755_INVERT_CD  BIT(30)
 127#define   PCI_GLI_9755_INVERT_WP  BIT(31)
 128
 129#define PCI_GLI_9755_CFG2          0x48
 130#define   PCI_GLI_9755_CFG2_L1DLY    GENMASK(28, 24)
 131#define   GLI_9755_CFG2_L1DLY_VALUE  0x1F
 132
 133#define PCI_GLI_9755_PLL            0x64
 134#define   PCI_GLI_9755_PLL_LDIV       GENMASK(9, 0)
 135#define   PCI_GLI_9755_PLL_PDIV       GENMASK(14, 12)
 136#define   PCI_GLI_9755_PLL_DIR        BIT(15)
 137#define   PCI_GLI_9755_PLLSSC_STEP    GENMASK(28, 24)
 138#define   PCI_GLI_9755_PLLSSC_EN      BIT(31)
 139
 140#define PCI_GLI_9755_PLLSSC        0x68
 141#define   PCI_GLI_9755_PLLSSC_PPM    GENMASK(15, 0)
 142
 143#define PCI_GLI_9755_SerDes  0x70
 144#define PCI_GLI_9755_SCP_DIS   BIT(19)
 145
 146#define PCI_GLI_9755_MISC	    0x78
 147#define   PCI_GLI_9755_MISC_SSC_OFF    BIT(26)
 148
 149#define PCI_GLI_9755_PM_CTRL     0xFC
 150#define   PCI_GLI_9755_PM_STATE    GENMASK(1, 0)
 151
 152#define GLI_MAX_TUNING_LOOP 40
 153
 154/* Genesys Logic chipset */
 155static inline void gl9750_wt_on(struct sdhci_host *host)
 156{
 157	u32 wt_value;
 158	u32 wt_enable;
 159
 160	wt_value = sdhci_readl(host, SDHCI_GLI_9750_WT);
 161	wt_enable = FIELD_GET(SDHCI_GLI_9750_WT_EN, wt_value);
 162
 163	if (wt_enable == GLI_9750_WT_EN_ON)
 164		return;
 165
 166	wt_value &= ~SDHCI_GLI_9750_WT_EN;
 167	wt_value |= FIELD_PREP(SDHCI_GLI_9750_WT_EN, GLI_9750_WT_EN_ON);
 168
 169	sdhci_writel(host, wt_value, SDHCI_GLI_9750_WT);
 170}
 171
 172static inline void gl9750_wt_off(struct sdhci_host *host)
 173{
 174	u32 wt_value;
 175	u32 wt_enable;
 176
 177	wt_value = sdhci_readl(host, SDHCI_GLI_9750_WT);
 178	wt_enable = FIELD_GET(SDHCI_GLI_9750_WT_EN, wt_value);
 179
 180	if (wt_enable == GLI_9750_WT_EN_OFF)
 181		return;
 182
 183	wt_value &= ~SDHCI_GLI_9750_WT_EN;
 184	wt_value |= FIELD_PREP(SDHCI_GLI_9750_WT_EN, GLI_9750_WT_EN_OFF);
 185
 186	sdhci_writel(host, wt_value, SDHCI_GLI_9750_WT);
 187}
 188
 189static void gli_set_9750(struct sdhci_host *host)
 190{
 191	u32 driving_value;
 192	u32 pll_value;
 193	u32 sw_ctrl_value;
 194	u32 misc_value;
 195	u32 parameter_value;
 196	u32 control_value;
 197	u16 ctrl2;
 198
 199	gl9750_wt_on(host);
 200
 201	driving_value = sdhci_readl(host, SDHCI_GLI_9750_DRIVING);
 202	pll_value = sdhci_readl(host, SDHCI_GLI_9750_PLL);
 203	sw_ctrl_value = sdhci_readl(host, SDHCI_GLI_9750_SW_CTRL);
 204	misc_value = sdhci_readl(host, SDHCI_GLI_9750_MISC);
 205	parameter_value = sdhci_readl(host, SDHCI_GLI_9750_TUNING_PARAMETERS);
 206	control_value = sdhci_readl(host, SDHCI_GLI_9750_TUNING_CONTROL);
 207
 208	driving_value &= ~(SDHCI_GLI_9750_DRIVING_1);
 209	driving_value &= ~(SDHCI_GLI_9750_DRIVING_2);
 210	driving_value |= FIELD_PREP(SDHCI_GLI_9750_DRIVING_1,
 211				    GLI_9750_DRIVING_1_VALUE);
 212	driving_value |= FIELD_PREP(SDHCI_GLI_9750_DRIVING_2,
 213				    GLI_9750_DRIVING_2_VALUE);
 214	driving_value &= ~(SDHCI_GLI_9750_SEL_1|SDHCI_GLI_9750_SEL_2|SDHCI_GLI_9750_ALL_RST);
 215	driving_value |= SDHCI_GLI_9750_SEL_2;
 216	sdhci_writel(host, driving_value, SDHCI_GLI_9750_DRIVING);
 217
 218	sw_ctrl_value &= ~SDHCI_GLI_9750_SW_CTRL_4;
 219	sw_ctrl_value |= FIELD_PREP(SDHCI_GLI_9750_SW_CTRL_4,
 220				    GLI_9750_SW_CTRL_4_VALUE);
 221	sdhci_writel(host, sw_ctrl_value, SDHCI_GLI_9750_SW_CTRL);
 222
 223	/* reset the tuning flow after reinit and before starting tuning */
 224	pll_value &= ~SDHCI_GLI_9750_PLL_TX2_INV;
 225	pll_value &= ~SDHCI_GLI_9750_PLL_TX2_DLY;
 226	pll_value |= FIELD_PREP(SDHCI_GLI_9750_PLL_TX2_INV,
 227				GLI_9750_PLL_TX2_INV_VALUE);
 228	pll_value |= FIELD_PREP(SDHCI_GLI_9750_PLL_TX2_DLY,
 229				GLI_9750_PLL_TX2_DLY_VALUE);
 230
 231	misc_value &= ~SDHCI_GLI_9750_MISC_TX1_INV;
 232	misc_value &= ~SDHCI_GLI_9750_MISC_RX_INV;
 233	misc_value &= ~SDHCI_GLI_9750_MISC_TX1_DLY;
 234	misc_value |= FIELD_PREP(SDHCI_GLI_9750_MISC_TX1_INV,
 235				 GLI_9750_MISC_TX1_INV_VALUE);
 236	misc_value |= FIELD_PREP(SDHCI_GLI_9750_MISC_RX_INV,
 237				 GLI_9750_MISC_RX_INV_VALUE);
 238	misc_value |= FIELD_PREP(SDHCI_GLI_9750_MISC_TX1_DLY,
 239				 GLI_9750_MISC_TX1_DLY_VALUE);
 240
 241	parameter_value &= ~SDHCI_GLI_9750_TUNING_PARAMETERS_RX_DLY;
 242	parameter_value |= FIELD_PREP(SDHCI_GLI_9750_TUNING_PARAMETERS_RX_DLY,
 243				      GLI_9750_TUNING_PARAMETERS_RX_DLY_VALUE);
 244
 245	control_value &= ~SDHCI_GLI_9750_TUNING_CONTROL_GLITCH_1;
 246	control_value &= ~SDHCI_GLI_9750_TUNING_CONTROL_GLITCH_2;
 247	control_value |= FIELD_PREP(SDHCI_GLI_9750_TUNING_CONTROL_GLITCH_1,
 248				    GLI_9750_TUNING_CONTROL_GLITCH_1_VALUE);
 249	control_value |= FIELD_PREP(SDHCI_GLI_9750_TUNING_CONTROL_GLITCH_2,
 250				    GLI_9750_TUNING_CONTROL_GLITCH_2_VALUE);
 251
 252	sdhci_writel(host, pll_value, SDHCI_GLI_9750_PLL);
 253	sdhci_writel(host, misc_value, SDHCI_GLI_9750_MISC);
 254
 255	/* disable tuned clk */
 256	ctrl2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
 257	ctrl2 &= ~SDHCI_CTRL_TUNED_CLK;
 258	sdhci_writew(host, ctrl2, SDHCI_HOST_CONTROL2);
 259
 260	/* enable tuning parameters control */
 261	control_value &= ~SDHCI_GLI_9750_TUNING_CONTROL_EN;
 262	control_value |= FIELD_PREP(SDHCI_GLI_9750_TUNING_CONTROL_EN,
 263				    GLI_9750_TUNING_CONTROL_EN_ON);
 264	sdhci_writel(host, control_value, SDHCI_GLI_9750_TUNING_CONTROL);
 265
 266	/* write tuning parameters */
 267	sdhci_writel(host, parameter_value, SDHCI_GLI_9750_TUNING_PARAMETERS);
 268
 269	/* disable tuning parameters control */
 270	control_value &= ~SDHCI_GLI_9750_TUNING_CONTROL_EN;
 271	control_value |= FIELD_PREP(SDHCI_GLI_9750_TUNING_CONTROL_EN,
 272				    GLI_9750_TUNING_CONTROL_EN_OFF);
 273	sdhci_writel(host, control_value, SDHCI_GLI_9750_TUNING_CONTROL);
 274
 275	/* clear tuned clk */
 276	ctrl2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
 277	ctrl2 &= ~SDHCI_CTRL_TUNED_CLK;
 278	sdhci_writew(host, ctrl2, SDHCI_HOST_CONTROL2);
 279
 280	gl9750_wt_off(host);
 281}
 282
 283static void gli_set_9750_rx_inv(struct sdhci_host *host, bool b)
 284{
 285	u32 misc_value;
 286
 287	gl9750_wt_on(host);
 288
 289	misc_value = sdhci_readl(host, SDHCI_GLI_9750_MISC);
 290	misc_value &= ~SDHCI_GLI_9750_MISC_RX_INV;
 291	if (b) {
 292		misc_value |= FIELD_PREP(SDHCI_GLI_9750_MISC_RX_INV,
 293					 GLI_9750_MISC_RX_INV_ON);
 294	} else {
 295		misc_value |= FIELD_PREP(SDHCI_GLI_9750_MISC_RX_INV,
 296					 GLI_9750_MISC_RX_INV_OFF);
 297	}
 298	sdhci_writel(host, misc_value, SDHCI_GLI_9750_MISC);
 299
 300	gl9750_wt_off(host);
 301}
 302
 303static int __sdhci_execute_tuning_9750(struct sdhci_host *host, u32 opcode)
 304{
 305	int i;
 306	int rx_inv;
 307
 308	for (rx_inv = 0; rx_inv < 2; rx_inv++) {
 309		gli_set_9750_rx_inv(host, !!rx_inv);
 310		sdhci_start_tuning(host);
 311
 312		for (i = 0; i < GLI_MAX_TUNING_LOOP; i++) {
 313			u16 ctrl;
 314
 315			sdhci_send_tuning(host, opcode);
 316
 317			if (!host->tuning_done) {
 318				sdhci_abort_tuning(host, opcode);
 319				break;
 320			}
 321
 322			ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
 323			if (!(ctrl & SDHCI_CTRL_EXEC_TUNING)) {
 324				if (ctrl & SDHCI_CTRL_TUNED_CLK)
 325					return 0; /* Success! */
 326				break;
 327			}
 328		}
 329	}
 330	if (!host->tuning_done) {
 331		pr_info("%s: Tuning timeout, falling back to fixed sampling clock\n",
 332			mmc_hostname(host->mmc));
 333		return -ETIMEDOUT;
 334	}
 335
 336	pr_info("%s: Tuning failed, falling back to fixed sampling clock\n",
 337		mmc_hostname(host->mmc));
 338	sdhci_reset_tuning(host);
 339
 340	return -EAGAIN;
 341}
 342
 343static int gl9750_execute_tuning(struct sdhci_host *host, u32 opcode)
 344{
 345	host->mmc->retune_period = 0;
 346	if (host->tuning_mode == SDHCI_TUNING_MODE_1)
 347		host->mmc->retune_period = host->tuning_count;
 348
 349	gli_set_9750(host);
 350	host->tuning_err = __sdhci_execute_tuning_9750(host, opcode);
 351	sdhci_end_tuning(host);
 352
 353	return 0;
 354}
 355
 356static void gl9750_disable_ssc_pll(struct sdhci_host *host)
 357{
 358	u32 pll;
 359
 360	gl9750_wt_on(host);
 361	pll = sdhci_readl(host, SDHCI_GLI_9750_PLL);
 362	pll &= ~(SDHCI_GLI_9750_PLL_DIR | SDHCI_GLI_9750_PLLSSC_EN);
 363	sdhci_writel(host, pll, SDHCI_GLI_9750_PLL);
 364	gl9750_wt_off(host);
 365}
 366
 367static void gl9750_set_pll(struct sdhci_host *host, u8 dir, u16 ldiv, u8 pdiv)
 368{
 369	u32 pll;
 370
 371	gl9750_wt_on(host);
 372	pll = sdhci_readl(host, SDHCI_GLI_9750_PLL);
 373	pll &= ~(SDHCI_GLI_9750_PLL_LDIV |
 374		 SDHCI_GLI_9750_PLL_PDIV |
 375		 SDHCI_GLI_9750_PLL_DIR);
 376	pll |= FIELD_PREP(SDHCI_GLI_9750_PLL_LDIV, ldiv) |
 377	       FIELD_PREP(SDHCI_GLI_9750_PLL_PDIV, pdiv) |
 378	       FIELD_PREP(SDHCI_GLI_9750_PLL_DIR, dir);
 379	sdhci_writel(host, pll, SDHCI_GLI_9750_PLL);
 380	gl9750_wt_off(host);
 381
 382	/* wait for pll stable */
 383	mdelay(1);
 384}
 385
 386static bool gl9750_ssc_enable(struct sdhci_host *host)
 387{
 388	u32 misc;
 389	u8 off;
 390
 391	gl9750_wt_on(host);
 392	misc = sdhci_readl(host, SDHCI_GLI_9750_MISC);
 393	off = FIELD_GET(SDHCI_GLI_9750_MISC_SSC_OFF, misc);
 394	gl9750_wt_off(host);
 395
 396	return !off;
 397}
 398
 399static void gl9750_set_ssc(struct sdhci_host *host, u8 enable, u8 step, u16 ppm)
 400{
 401	u32 pll;
 402	u32 ssc;
 403
 404	gl9750_wt_on(host);
 405	pll = sdhci_readl(host, SDHCI_GLI_9750_PLL);
 406	ssc = sdhci_readl(host, SDHCI_GLI_9750_PLLSSC);
 407	pll &= ~(SDHCI_GLI_9750_PLLSSC_STEP |
 408		 SDHCI_GLI_9750_PLLSSC_EN);
 409	ssc &= ~SDHCI_GLI_9750_PLLSSC_PPM;
 410	pll |= FIELD_PREP(SDHCI_GLI_9750_PLLSSC_STEP, step) |
 411	       FIELD_PREP(SDHCI_GLI_9750_PLLSSC_EN, enable);
 412	ssc |= FIELD_PREP(SDHCI_GLI_9750_PLLSSC_PPM, ppm);
 413	sdhci_writel(host, ssc, SDHCI_GLI_9750_PLLSSC);
 414	sdhci_writel(host, pll, SDHCI_GLI_9750_PLL);
 415	gl9750_wt_off(host);
 416}
 417
 418static void gl9750_set_ssc_pll_205mhz(struct sdhci_host *host)
 419{
 420	bool enable = gl9750_ssc_enable(host);
 421
 422	/* set pll to 205MHz and ssc */
 423	gl9750_set_ssc(host, enable, 0xF, 0x5A1D);
 424	gl9750_set_pll(host, 0x1, 0x246, 0x0);
 425}
 426
 427static void gl9750_set_ssc_pll_100mhz(struct sdhci_host *host)
 428{
 429	bool enable = gl9750_ssc_enable(host);
 430
 431	/* set pll to 100MHz and ssc */
 432	gl9750_set_ssc(host, enable, 0xE, 0x51EC);
 433	gl9750_set_pll(host, 0x1, 0x244, 0x1);
 434}
 435
 436static void gl9750_set_ssc_pll_50mhz(struct sdhci_host *host)
 437{
 438	bool enable = gl9750_ssc_enable(host);
 439
 440	/* set pll to 50MHz and ssc */
 441	gl9750_set_ssc(host, enable, 0xE, 0x51EC);
 442	gl9750_set_pll(host, 0x1, 0x244, 0x3);
 443}
 444
 445static void sdhci_gl9750_set_clock(struct sdhci_host *host, unsigned int clock)
 446{
 447	struct mmc_ios *ios = &host->mmc->ios;
 448	u16 clk;
 449
 450	host->mmc->actual_clock = 0;
 451
 452	gl9750_disable_ssc_pll(host);
 453	sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
 454
 455	if (clock == 0)
 456		return;
 457
 458	clk = sdhci_calc_clk(host, clock, &host->mmc->actual_clock);
 459	if (clock == 200000000 && ios->timing == MMC_TIMING_UHS_SDR104) {
 460		host->mmc->actual_clock = 205000000;
 461		gl9750_set_ssc_pll_205mhz(host);
 462	} else if (clock == 100000000) {
 463		gl9750_set_ssc_pll_100mhz(host);
 464	} else if (clock == 50000000) {
 465		gl9750_set_ssc_pll_50mhz(host);
 466	}
 467
 468	sdhci_enable_clk(host, clk);
 469}
 470
 471static void gl9750_hw_setting(struct sdhci_host *host)
 472{
 473	u32 value;
 474
 475	gl9750_wt_on(host);
 476
 477	value = sdhci_readl(host, SDHCI_GLI_9750_CFG2);
 478	value &= ~SDHCI_GLI_9750_CFG2_L1DLY;
 479	/* set ASPM L1 entry delay to 7.9us */
 480	value |= FIELD_PREP(SDHCI_GLI_9750_CFG2_L1DLY,
 481			    GLI_9750_CFG2_L1DLY_VALUE);
 482	sdhci_writel(host, value, SDHCI_GLI_9750_CFG2);
 483
 484	gl9750_wt_off(host);
 485}
 486
 487static void gli_pcie_enable_msi(struct sdhci_pci_slot *slot)
 488{
 489	int ret;
 490
 491	ret = pci_alloc_irq_vectors(slot->chip->pdev, 1, 1,
 492				    PCI_IRQ_MSI | PCI_IRQ_MSIX);
 493	if (ret < 0) {
 494		pr_warn("%s: enable PCI MSI failed, error=%d\n",
 495		       mmc_hostname(slot->host->mmc), ret);
 496		return;
 497	}
 498
 499	slot->host->irq = pci_irq_vector(slot->chip->pdev, 0);
 500}
 501
 502static inline void gl9755_wt_on(struct pci_dev *pdev)
 503{
 504	u32 wt_value;
 505	u32 wt_enable;
 506
 507	pci_read_config_dword(pdev, PCI_GLI_9755_WT, &wt_value);
 508	wt_enable = FIELD_GET(PCI_GLI_9755_WT_EN, wt_value);
 509
 510	if (wt_enable == GLI_9755_WT_EN_ON)
 511		return;
 512
 513	wt_value &= ~PCI_GLI_9755_WT_EN;
 514	wt_value |= FIELD_PREP(PCI_GLI_9755_WT_EN, GLI_9755_WT_EN_ON);
 515
 516	pci_write_config_dword(pdev, PCI_GLI_9755_WT, wt_value);
 517}
 518
 519static inline void gl9755_wt_off(struct pci_dev *pdev)
 520{
 521	u32 wt_value;
 522	u32 wt_enable;
 523
 524	pci_read_config_dword(pdev, PCI_GLI_9755_WT, &wt_value);
 525	wt_enable = FIELD_GET(PCI_GLI_9755_WT_EN, wt_value);
 526
 527	if (wt_enable == GLI_9755_WT_EN_OFF)
 528		return;
 529
 530	wt_value &= ~PCI_GLI_9755_WT_EN;
 531	wt_value |= FIELD_PREP(PCI_GLI_9755_WT_EN, GLI_9755_WT_EN_OFF);
 532
 533	pci_write_config_dword(pdev, PCI_GLI_9755_WT, wt_value);
 534}
 535
 536static void gl9755_disable_ssc_pll(struct pci_dev *pdev)
 537{
 538	u32 pll;
 539
 540	gl9755_wt_on(pdev);
 541	pci_read_config_dword(pdev, PCI_GLI_9755_PLL, &pll);
 542	pll &= ~(PCI_GLI_9755_PLL_DIR | PCI_GLI_9755_PLLSSC_EN);
 543	pci_write_config_dword(pdev, PCI_GLI_9755_PLL, pll);
 544	gl9755_wt_off(pdev);
 545}
 546
 547static void gl9755_set_pll(struct pci_dev *pdev, u8 dir, u16 ldiv, u8 pdiv)
 548{
 549	u32 pll;
 550
 551	gl9755_wt_on(pdev);
 552	pci_read_config_dword(pdev, PCI_GLI_9755_PLL, &pll);
 553	pll &= ~(PCI_GLI_9755_PLL_LDIV |
 554		 PCI_GLI_9755_PLL_PDIV |
 555		 PCI_GLI_9755_PLL_DIR);
 556	pll |= FIELD_PREP(PCI_GLI_9755_PLL_LDIV, ldiv) |
 557	       FIELD_PREP(PCI_GLI_9755_PLL_PDIV, pdiv) |
 558	       FIELD_PREP(PCI_GLI_9755_PLL_DIR, dir);
 559	pci_write_config_dword(pdev, PCI_GLI_9755_PLL, pll);
 560	gl9755_wt_off(pdev);
 561
 562	/* wait for pll stable */
 563	mdelay(1);
 564}
 565
 566static bool gl9755_ssc_enable(struct pci_dev *pdev)
 567{
 568	u32 misc;
 569	u8 off;
 570
 571	gl9755_wt_on(pdev);
 572	pci_read_config_dword(pdev, PCI_GLI_9755_MISC, &misc);
 573	off = FIELD_GET(PCI_GLI_9755_MISC_SSC_OFF, misc);
 574	gl9755_wt_off(pdev);
 575
 576	return !off;
 577}
 578
 579static void gl9755_set_ssc(struct pci_dev *pdev, u8 enable, u8 step, u16 ppm)
 580{
 581	u32 pll;
 582	u32 ssc;
 583
 584	gl9755_wt_on(pdev);
 585	pci_read_config_dword(pdev, PCI_GLI_9755_PLL, &pll);
 586	pci_read_config_dword(pdev, PCI_GLI_9755_PLLSSC, &ssc);
 587	pll &= ~(PCI_GLI_9755_PLLSSC_STEP |
 588		 PCI_GLI_9755_PLLSSC_EN);
 589	ssc &= ~PCI_GLI_9755_PLLSSC_PPM;
 590	pll |= FIELD_PREP(PCI_GLI_9755_PLLSSC_STEP, step) |
 591	       FIELD_PREP(PCI_GLI_9755_PLLSSC_EN, enable);
 592	ssc |= FIELD_PREP(PCI_GLI_9755_PLLSSC_PPM, ppm);
 593	pci_write_config_dword(pdev, PCI_GLI_9755_PLLSSC, ssc);
 594	pci_write_config_dword(pdev, PCI_GLI_9755_PLL, pll);
 595	gl9755_wt_off(pdev);
 596}
 597
 598static void gl9755_set_ssc_pll_205mhz(struct pci_dev *pdev)
 599{
 600	bool enable = gl9755_ssc_enable(pdev);
 601
 602	/* set pll to 205MHz and ssc */
 603	gl9755_set_ssc(pdev, enable, 0xF, 0x5A1D);
 604	gl9755_set_pll(pdev, 0x1, 0x246, 0x0);
 605}
 606
 607static void gl9755_set_ssc_pll_100mhz(struct pci_dev *pdev)
 608{
 609	bool enable = gl9755_ssc_enable(pdev);
 610
 611	/* set pll to 100MHz and ssc */
 612	gl9755_set_ssc(pdev, enable, 0xE, 0x51EC);
 613	gl9755_set_pll(pdev, 0x1, 0x244, 0x1);
 614}
 615
 616static void gl9755_set_ssc_pll_50mhz(struct pci_dev *pdev)
 617{
 618	bool enable = gl9755_ssc_enable(pdev);
 619
 620	/* set pll to 50MHz and ssc */
 621	gl9755_set_ssc(pdev, enable, 0xE, 0x51EC);
 622	gl9755_set_pll(pdev, 0x1, 0x244, 0x3);
 623}
 624
 625static void sdhci_gl9755_set_clock(struct sdhci_host *host, unsigned int clock)
 626{
 627	struct sdhci_pci_slot *slot = sdhci_priv(host);
 628	struct mmc_ios *ios = &host->mmc->ios;
 629	struct pci_dev *pdev;
 630	u16 clk;
 631
 632	pdev = slot->chip->pdev;
 633	host->mmc->actual_clock = 0;
 634
 635	gl9755_disable_ssc_pll(pdev);
 636	sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
 637
 638	if (clock == 0)
 639		return;
 640
 641	clk = sdhci_calc_clk(host, clock, &host->mmc->actual_clock);
 642	if (clock == 200000000 && ios->timing == MMC_TIMING_UHS_SDR104) {
 643		host->mmc->actual_clock = 205000000;
 644		gl9755_set_ssc_pll_205mhz(pdev);
 645	} else if (clock == 100000000) {
 646		gl9755_set_ssc_pll_100mhz(pdev);
 647	} else if (clock == 50000000) {
 648		gl9755_set_ssc_pll_50mhz(pdev);
 649	}
 650
 651	sdhci_enable_clk(host, clk);
 652}
 653
 654static void gl9755_hw_setting(struct sdhci_pci_slot *slot)
 655{
 656	struct pci_dev *pdev = slot->chip->pdev;
 657	u32 value;
 658
 659	gl9755_wt_on(pdev);
 660
 661	pci_read_config_dword(pdev, PCI_GLI_9755_PECONF, &value);
 662	/*
 663	 * Apple ARM64 platforms using these chips may have
 664	 * inverted CD/WP detection.
 665	 */
 666	if (of_property_read_bool(pdev->dev.of_node, "cd-inverted"))
 667		value |= PCI_GLI_9755_INVERT_CD;
 668	if (of_property_read_bool(pdev->dev.of_node, "wp-inverted"))
 669		value |= PCI_GLI_9755_INVERT_WP;
 670	value &= ~PCI_GLI_9755_LFCLK;
 671	value &= ~PCI_GLI_9755_DMACLK;
 672	pci_write_config_dword(pdev, PCI_GLI_9755_PECONF, value);
 673
 674	/* enable short circuit protection */
 675	pci_read_config_dword(pdev, PCI_GLI_9755_SerDes, &value);
 676	value &= ~PCI_GLI_9755_SCP_DIS;
 677	pci_write_config_dword(pdev, PCI_GLI_9755_SerDes, value);
 678
 679	pci_read_config_dword(pdev, PCI_GLI_9755_CFG2, &value);
 680	value &= ~PCI_GLI_9755_CFG2_L1DLY;
 681	/* set ASPM L1 entry delay to 7.9us */
 682	value |= FIELD_PREP(PCI_GLI_9755_CFG2_L1DLY,
 683			    GLI_9755_CFG2_L1DLY_VALUE);
 684	pci_write_config_dword(pdev, PCI_GLI_9755_CFG2, value);
 685
 686	/* toggle PM state to allow GL9755 to enter ASPM L1.2 */
 687	pci_read_config_dword(pdev, PCI_GLI_9755_PM_CTRL, &value);
 688	value |= PCI_GLI_9755_PM_STATE;
 689	pci_write_config_dword(pdev, PCI_GLI_9755_PM_CTRL, value);
 690	value &= ~PCI_GLI_9755_PM_STATE;
 691	pci_write_config_dword(pdev, PCI_GLI_9755_PM_CTRL, value);
 692
 693	gl9755_wt_off(pdev);
 694}
 695
 696static int gli_probe_slot_gl9750(struct sdhci_pci_slot *slot)
 697{
 698	struct sdhci_host *host = slot->host;
 699
 700	gl9750_hw_setting(host);
 701	gli_pcie_enable_msi(slot);
 702	slot->host->mmc->caps2 |= MMC_CAP2_NO_SDIO;
 703	sdhci_enable_v4_mode(host);
 704
 705	return 0;
 706}
 707
 708static int gli_probe_slot_gl9755(struct sdhci_pci_slot *slot)
 709{
 710	struct sdhci_host *host = slot->host;
 711
 712	gl9755_hw_setting(slot);
 713	gli_pcie_enable_msi(slot);
 714	slot->host->mmc->caps2 |= MMC_CAP2_NO_SDIO;
 715	sdhci_enable_v4_mode(host);
 716
 717	return 0;
 718}
 719
 720static void sdhci_gli_voltage_switch(struct sdhci_host *host)
 721{
 722	/*
 723	 * According to Section 3.6.1 signal voltage switch procedure in
 724	 * SD Host Controller Simplified Spec. 4.20, steps 6~8 are as
 725	 * follows:
 726	 * (6) Set 1.8V Signal Enable in the Host Control 2 register.
 727	 * (7) Wait 5ms. 1.8V voltage regulator shall be stable within this
 728	 *     period.
 729	 * (8) If 1.8V Signal Enable is cleared by Host Controller, go to
 730	 *     step (12).
 731	 *
 732	 * Wait 5ms after set 1.8V signal enable in Host Control 2 register
 733	 * to ensure 1.8V signal enable bit is set by GL9750/GL9755.
 734	 *
 735	 * ...however, the controller in the NUC10i3FNK4 (a 9755) requires
 736	 * slightly longer than 5ms before the control register reports that
 737	 * 1.8V is ready, and far longer still before the card will actually
 738	 * work reliably.
 739	 */
 740	usleep_range(100000, 110000);
 741}
 742
 743static void sdhci_gl9750_reset(struct sdhci_host *host, u8 mask)
 744{
 745	sdhci_reset(host, mask);
 746	gli_set_9750(host);
 747}
 748
 749static u32 sdhci_gl9750_readl(struct sdhci_host *host, int reg)
 750{
 751	u32 value;
 752
 753	value = readl(host->ioaddr + reg);
 754	if (unlikely(reg == SDHCI_MAX_CURRENT && !(value & 0xff)))
 755		value |= 0xc8;
 756
 757	return value;
 758}
 759
 760#ifdef CONFIG_PM_SLEEP
 761static int sdhci_pci_gli_resume(struct sdhci_pci_chip *chip)
 762{
 763	struct sdhci_pci_slot *slot = chip->slots[0];
 764
 765	pci_free_irq_vectors(slot->chip->pdev);
 766	gli_pcie_enable_msi(slot);
 767
 768	return sdhci_pci_resume_host(chip);
 769}
 770
 771static int sdhci_cqhci_gli_resume(struct sdhci_pci_chip *chip)
 772{
 773	struct sdhci_pci_slot *slot = chip->slots[0];
 774	int ret;
 775
 776	ret = sdhci_pci_gli_resume(chip);
 777	if (ret)
 778		return ret;
 779
 780	return cqhci_resume(slot->host->mmc);
 781}
 782
 783static int sdhci_cqhci_gli_suspend(struct sdhci_pci_chip *chip)
 784{
 785	struct sdhci_pci_slot *slot = chip->slots[0];
 786	int ret;
 787
 788	ret = cqhci_suspend(slot->host->mmc);
 789	if (ret)
 790		return ret;
 791
 792	return sdhci_suspend_host(slot->host);
 793}
 794#endif
 795
 796static void gl9763e_hs400_enhanced_strobe(struct mmc_host *mmc,
 797					  struct mmc_ios *ios)
 798{
 799	struct sdhci_host *host = mmc_priv(mmc);
 800	u32 val;
 801
 802	val = sdhci_readl(host, SDHCI_GLI_9763E_HS400_ES_REG);
 803	if (ios->enhanced_strobe)
 804		val |= SDHCI_GLI_9763E_HS400_ES_BIT;
 805	else
 806		val &= ~SDHCI_GLI_9763E_HS400_ES_BIT;
 807
 808	sdhci_writel(host, val, SDHCI_GLI_9763E_HS400_ES_REG);
 809}
 810
 811static void sdhci_set_gl9763e_signaling(struct sdhci_host *host,
 812					unsigned int timing)
 813{
 814	u16 ctrl_2;
 815
 816	ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
 817	ctrl_2 &= ~SDHCI_CTRL_UHS_MASK;
 818	if (timing == MMC_TIMING_MMC_HS200)
 819		ctrl_2 |= SDHCI_CTRL_UHS_SDR104;
 820	else if (timing == MMC_TIMING_MMC_HS)
 821		ctrl_2 |= SDHCI_CTRL_UHS_SDR25;
 822	else if (timing == MMC_TIMING_MMC_DDR52)
 823		ctrl_2 |= SDHCI_CTRL_UHS_DDR50;
 824	else if (timing == MMC_TIMING_MMC_HS400)
 825		ctrl_2 |= SDHCI_GLI_9763E_CTRL_HS400;
 826
 827	sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2);
 828}
 829
 830static void sdhci_gl9763e_dumpregs(struct mmc_host *mmc)
 831{
 832	sdhci_dumpregs(mmc_priv(mmc));
 833}
 834
 835static void sdhci_gl9763e_cqe_pre_enable(struct mmc_host *mmc)
 836{
 837	struct cqhci_host *cq_host = mmc->cqe_private;
 838	u32 value;
 839
 840	value = cqhci_readl(cq_host, CQHCI_CFG);
 841	value |= CQHCI_ENABLE;
 842	cqhci_writel(cq_host, value, CQHCI_CFG);
 843}
 844
 845static void sdhci_gl9763e_cqe_enable(struct mmc_host *mmc)
 846{
 847	struct sdhci_host *host = mmc_priv(mmc);
 848
 849	sdhci_writew(host, GLI_9763E_CQE_TRNS_MODE, SDHCI_TRANSFER_MODE);
 850	sdhci_cqe_enable(mmc);
 851}
 852
 853static u32 sdhci_gl9763e_cqhci_irq(struct sdhci_host *host, u32 intmask)
 854{
 855	int cmd_error = 0;
 856	int data_error = 0;
 857
 858	if (!sdhci_cqe_irq(host, intmask, &cmd_error, &data_error))
 859		return intmask;
 860
 861	cqhci_irq(host->mmc, intmask, cmd_error, data_error);
 862
 863	return 0;
 864}
 865
 866static void sdhci_gl9763e_cqe_post_disable(struct mmc_host *mmc)
 867{
 868	struct sdhci_host *host = mmc_priv(mmc);
 869	struct cqhci_host *cq_host = mmc->cqe_private;
 870	u32 value;
 871
 872	value = cqhci_readl(cq_host, CQHCI_CFG);
 873	value &= ~CQHCI_ENABLE;
 874	cqhci_writel(cq_host, value, CQHCI_CFG);
 875	sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE);
 876}
 877
 878static const struct cqhci_host_ops sdhci_gl9763e_cqhci_ops = {
 879	.enable         = sdhci_gl9763e_cqe_enable,
 880	.disable        = sdhci_cqe_disable,
 881	.dumpregs       = sdhci_gl9763e_dumpregs,
 882	.pre_enable     = sdhci_gl9763e_cqe_pre_enable,
 883	.post_disable   = sdhci_gl9763e_cqe_post_disable,
 884};
 885
 886static int gl9763e_add_host(struct sdhci_pci_slot *slot)
 887{
 888	struct device *dev = &slot->chip->pdev->dev;
 889	struct sdhci_host *host = slot->host;
 890	struct cqhci_host *cq_host;
 891	bool dma64;
 892	int ret;
 893
 894	ret = sdhci_setup_host(host);
 895	if (ret)
 896		return ret;
 897
 898	cq_host = devm_kzalloc(dev, sizeof(*cq_host), GFP_KERNEL);
 899	if (!cq_host) {
 900		ret = -ENOMEM;
 901		goto cleanup;
 902	}
 903
 904	cq_host->mmio = host->ioaddr + SDHCI_GLI_9763E_CQE_BASE_ADDR;
 905	cq_host->ops = &sdhci_gl9763e_cqhci_ops;
 906
 907	dma64 = host->flags & SDHCI_USE_64_BIT_DMA;
 908	if (dma64)
 909		cq_host->caps |= CQHCI_TASK_DESC_SZ_128;
 910
 911	ret = cqhci_init(cq_host, host->mmc, dma64);
 912	if (ret)
 913		goto cleanup;
 914
 915	ret = __sdhci_add_host(host);
 916	if (ret)
 917		goto cleanup;
 918
 919	return 0;
 920
 921cleanup:
 922	sdhci_cleanup_host(host);
 923	return ret;
 924}
 925
 926static void gli_set_gl9763e(struct sdhci_pci_slot *slot)
 927{
 928	struct pci_dev *pdev = slot->chip->pdev;
 929	u32 value;
 930
 931	pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &value);
 932	value &= ~GLI_9763E_VHS_REV;
 933	value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_W);
 934	pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value);
 935
 936	pci_read_config_dword(pdev, PCIE_GLI_9763E_SCR, &value);
 937	value |= GLI_9763E_SCR_AXI_REQ;
 938	pci_write_config_dword(pdev, PCIE_GLI_9763E_SCR, value);
 939
 940	pci_read_config_dword(pdev, PCIE_GLI_9763E_MMC_CTRL, &value);
 941	value &= ~GLI_9763E_HS400_SLOW;
 942	pci_write_config_dword(pdev, PCIE_GLI_9763E_MMC_CTRL, value);
 943
 944	pci_read_config_dword(pdev, PCIE_GLI_9763E_CFG2, &value);
 945	value &= ~GLI_9763E_CFG2_L1DLY;
 946	/* set ASPM L1 entry delay to 21us */
 947	value |= FIELD_PREP(GLI_9763E_CFG2_L1DLY, GLI_9763E_CFG2_L1DLY_MID);
 948	pci_write_config_dword(pdev, PCIE_GLI_9763E_CFG2, value);
 949
 950	pci_read_config_dword(pdev, PCIE_GLI_9763E_CLKRXDLY, &value);
 951	value &= ~GLI_9763E_HS400_RXDLY;
 952	value |= FIELD_PREP(GLI_9763E_HS400_RXDLY, GLI_9763E_HS400_RXDLY_5);
 953	pci_write_config_dword(pdev, PCIE_GLI_9763E_CLKRXDLY, value);
 954
 955	pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &value);
 956	value &= ~GLI_9763E_VHS_REV;
 957	value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_R);
 958	pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value);
 959}
 960
 961#ifdef CONFIG_PM
 962static void gl9763e_set_low_power_negotiation(struct sdhci_pci_slot *slot, bool enable)
 963{
 964	struct pci_dev *pdev = slot->chip->pdev;
 965	u32 value;
 966
 967	pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &value);
 968	value &= ~GLI_9763E_VHS_REV;
 969	value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_W);
 970	pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value);
 971
 972	pci_read_config_dword(pdev, PCIE_GLI_9763E_CFG, &value);
 973
 974	if (enable)
 975		value &= ~GLI_9763E_CFG_LPSN_DIS;
 976	else
 977		value |= GLI_9763E_CFG_LPSN_DIS;
 978
 979	pci_write_config_dword(pdev, PCIE_GLI_9763E_CFG, value);
 980
 981	pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &value);
 982	value &= ~GLI_9763E_VHS_REV;
 983	value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_R);
 984	pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value);
 985}
 986
 987static int gl9763e_runtime_suspend(struct sdhci_pci_chip *chip)
 988{
 989	struct sdhci_pci_slot *slot = chip->slots[0];
 990	struct sdhci_host *host = slot->host;
 991	u16 clock;
 992
 993	/* Enable LPM negotiation to allow entering L1 state */
 994	gl9763e_set_low_power_negotiation(slot, true);
 995
 996	clock = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
 997	clock &= ~(SDHCI_CLOCK_PLL_EN | SDHCI_CLOCK_CARD_EN);
 998	sdhci_writew(host, clock, SDHCI_CLOCK_CONTROL);
 999
1000	return 0;
1001}
1002
1003static int gl9763e_runtime_resume(struct sdhci_pci_chip *chip)
1004{
1005	struct sdhci_pci_slot *slot = chip->slots[0];
1006	struct sdhci_host *host = slot->host;
1007	u16 clock;
1008
1009	if (host->mmc->ios.power_mode != MMC_POWER_ON)
1010		return 0;
1011
1012	clock = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
1013
1014	clock |= SDHCI_CLOCK_PLL_EN;
1015	clock &= ~SDHCI_CLOCK_INT_STABLE;
1016	sdhci_writew(host, clock, SDHCI_CLOCK_CONTROL);
1017
1018	/* Wait max 150 ms */
1019	if (read_poll_timeout(sdhci_readw, clock, (clock & SDHCI_CLOCK_INT_STABLE),
1020			      1000, 150000, false, host, SDHCI_CLOCK_CONTROL)) {
1021		pr_err("%s: PLL clock never stabilised.\n",
1022		       mmc_hostname(host->mmc));
1023		sdhci_dumpregs(host);
1024	}
1025
1026	clock |= SDHCI_CLOCK_CARD_EN;
1027	sdhci_writew(host, clock, SDHCI_CLOCK_CONTROL);
1028
1029	/* Disable LPM negotiation to avoid entering L1 state. */
1030	gl9763e_set_low_power_negotiation(slot, false);
1031
1032	return 0;
1033}
1034#endif
1035
1036static int gli_probe_slot_gl9763e(struct sdhci_pci_slot *slot)
1037{
1038	struct pci_dev *pdev = slot->chip->pdev;
1039	struct sdhci_host *host = slot->host;
1040	u32 value;
1041
1042	host->mmc->caps |= MMC_CAP_8_BIT_DATA |
1043			   MMC_CAP_1_8V_DDR |
1044			   MMC_CAP_NONREMOVABLE;
1045	host->mmc->caps2 |= MMC_CAP2_HS200_1_8V_SDR |
1046			    MMC_CAP2_HS400_1_8V |
1047			    MMC_CAP2_HS400_ES |
1048			    MMC_CAP2_NO_SDIO |
1049			    MMC_CAP2_NO_SD;
1050
1051	pci_read_config_dword(pdev, PCIE_GLI_9763E_MB, &value);
1052	if (!(value & GLI_9763E_MB_CMDQ_OFF))
1053		if (value & GLI_9763E_MB_ERP_ON)
1054			host->mmc->caps2 |= MMC_CAP2_CQE | MMC_CAP2_CQE_DCMD;
1055
1056	gli_pcie_enable_msi(slot);
1057	host->mmc_host_ops.hs400_enhanced_strobe =
1058					gl9763e_hs400_enhanced_strobe;
1059	gli_set_gl9763e(slot);
1060	sdhci_enable_v4_mode(host);
1061
1062	return 0;
1063}
1064
1065#define REG_OFFSET_IN_BITS(reg) ((reg) << 3 & 0x18)
1066
1067static u16 sdhci_gli_readw(struct sdhci_host *host, int reg)
1068{
1069	u32 val = readl(host->ioaddr + (reg & ~3));
1070	u16 word;
1071
1072	word = (val >> REG_OFFSET_IN_BITS(reg)) & 0xffff;
1073	return word;
1074}
1075
1076static u8 sdhci_gli_readb(struct sdhci_host *host, int reg)
1077{
1078	u32 val = readl(host->ioaddr + (reg & ~3));
1079	u8 byte = (val >> REG_OFFSET_IN_BITS(reg)) & 0xff;
1080
1081	return byte;
1082}
1083
1084static const struct sdhci_ops sdhci_gl9755_ops = {
1085	.read_w			= sdhci_gli_readw,
1086	.read_b			= sdhci_gli_readb,
1087	.set_clock		= sdhci_gl9755_set_clock,
1088	.enable_dma		= sdhci_pci_enable_dma,
1089	.set_bus_width		= sdhci_set_bus_width,
1090	.reset			= sdhci_reset,
1091	.set_uhs_signaling	= sdhci_set_uhs_signaling,
1092	.voltage_switch		= sdhci_gli_voltage_switch,
1093};
1094
1095const struct sdhci_pci_fixes sdhci_gl9755 = {
1096	.quirks		= SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
1097	.quirks2	= SDHCI_QUIRK2_BROKEN_DDR50,
1098	.probe_slot	= gli_probe_slot_gl9755,
1099	.ops            = &sdhci_gl9755_ops,
1100#ifdef CONFIG_PM_SLEEP
1101	.resume         = sdhci_pci_gli_resume,
1102#endif
1103};
1104
1105static const struct sdhci_ops sdhci_gl9750_ops = {
1106	.read_w			= sdhci_gli_readw,
1107	.read_b			= sdhci_gli_readb,
1108	.read_l                 = sdhci_gl9750_readl,
1109	.set_clock		= sdhci_gl9750_set_clock,
1110	.enable_dma		= sdhci_pci_enable_dma,
1111	.set_bus_width		= sdhci_set_bus_width,
1112	.reset			= sdhci_gl9750_reset,
1113	.set_uhs_signaling	= sdhci_set_uhs_signaling,
1114	.voltage_switch		= sdhci_gli_voltage_switch,
1115	.platform_execute_tuning = gl9750_execute_tuning,
1116};
1117
1118const struct sdhci_pci_fixes sdhci_gl9750 = {
1119	.quirks		= SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
1120	.quirks2	= SDHCI_QUIRK2_BROKEN_DDR50,
1121	.probe_slot	= gli_probe_slot_gl9750,
1122	.ops            = &sdhci_gl9750_ops,
1123#ifdef CONFIG_PM_SLEEP
1124	.resume         = sdhci_pci_gli_resume,
1125#endif
1126};
1127
1128static const struct sdhci_ops sdhci_gl9763e_ops = {
1129	.set_clock		= sdhci_set_clock,
1130	.enable_dma		= sdhci_pci_enable_dma,
1131	.set_bus_width		= sdhci_set_bus_width,
1132	.reset			= sdhci_and_cqhci_reset,
1133	.set_uhs_signaling	= sdhci_set_gl9763e_signaling,
1134	.voltage_switch		= sdhci_gli_voltage_switch,
1135	.irq                    = sdhci_gl9763e_cqhci_irq,
1136};
1137
1138const struct sdhci_pci_fixes sdhci_gl9763e = {
1139	.quirks		= SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
1140	.probe_slot	= gli_probe_slot_gl9763e,
1141	.ops            = &sdhci_gl9763e_ops,
1142#ifdef CONFIG_PM_SLEEP
1143	.resume		= sdhci_cqhci_gli_resume,
1144	.suspend	= sdhci_cqhci_gli_suspend,
1145#endif
1146#ifdef CONFIG_PM
1147	.runtime_suspend = gl9763e_runtime_suspend,
1148	.runtime_resume  = gl9763e_runtime_resume,
1149	.allow_runtime_pm = true,
1150#endif
1151	.add_host       = gl9763e_add_host,
1152};