at master 63 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2019 MediaTek Inc. 4 * Authors: 5 * Stanley Chu <stanley.chu@mediatek.com> 6 * Peter Wang <peter.wang@mediatek.com> 7 */ 8 9#include <linux/arm-smccc.h> 10#include <linux/bitfield.h> 11#include <linux/clk.h> 12#include <linux/delay.h> 13#include <linux/module.h> 14#include <linux/of.h> 15#include <linux/of_address.h> 16#include <linux/of_device.h> 17#include <linux/of_platform.h> 18#include <linux/phy/phy.h> 19#include <linux/platform_device.h> 20#include <linux/regulator/consumer.h> 21#include <linux/reset.h> 22 23#include <ufs/ufshcd.h> 24#include "ufshcd-pltfrm.h" 25#include <ufs/ufs_quirks.h> 26#include <ufs/unipro.h> 27 28#include "ufs-mediatek.h" 29#include "ufs-mediatek-sip.h" 30 31static int ufs_mtk_config_mcq(struct ufs_hba *hba, bool irq); 32static void _ufs_mtk_clk_scale(struct ufs_hba *hba, bool scale_up); 33 34#define CREATE_TRACE_POINTS 35#include "ufs-mediatek-trace.h" 36#undef CREATE_TRACE_POINTS 37 38#define MAX_SUPP_MAC 64 39#define MCQ_QUEUE_OFFSET(c) ((((c) >> 16) & 0xFF) * 0x200) 40 41static const struct ufs_dev_quirk ufs_mtk_dev_fixups[] = { 42 { .wmanufacturerid = UFS_ANY_VENDOR, 43 .model = UFS_ANY_MODEL, 44 .quirk = UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM }, 45 { .wmanufacturerid = UFS_VENDOR_SKHYNIX, 46 .model = "H9HQ21AFAMZDAR", 47 .quirk = UFS_DEVICE_QUIRK_SUPPORT_EXTENDED_FEATURES }, 48 {} 49}; 50 51static const struct of_device_id ufs_mtk_of_match[] = { 52 { .compatible = "mediatek,mt8183-ufshci" }, 53 { .compatible = "mediatek,mt8195-ufshci" }, 54 {}, 55}; 56MODULE_DEVICE_TABLE(of, ufs_mtk_of_match); 57 58/* 59 * Details of UIC Errors 60 */ 61static const char *const ufs_uic_err_str[] = { 62 "PHY Adapter Layer", 63 "Data Link Layer", 64 "Network Link Layer", 65 "Transport Link Layer", 66 "DME" 67}; 68 69static const char *const ufs_uic_pa_err_str[] = { 70 "PHY error on Lane 0", 71 "PHY error on Lane 1", 72 "PHY error on Lane 2", 73 "PHY error on Lane 3", 74 "Generic PHY Adapter Error. This should be the LINERESET indication" 75}; 76 77static const char *const ufs_uic_dl_err_str[] = { 78 "NAC_RECEIVED", 79 "TCx_REPLAY_TIMER_EXPIRED", 80 "AFCx_REQUEST_TIMER_EXPIRED", 81 "FCx_PROTECTION_TIMER_EXPIRED", 82 "CRC_ERROR", 83 "RX_BUFFER_OVERFLOW", 84 "MAX_FRAME_LENGTH_EXCEEDED", 85 "WRONG_SEQUENCE_NUMBER", 86 "AFC_FRAME_SYNTAX_ERROR", 87 "NAC_FRAME_SYNTAX_ERROR", 88 "EOF_SYNTAX_ERROR", 89 "FRAME_SYNTAX_ERROR", 90 "BAD_CTRL_SYMBOL_TYPE", 91 "PA_INIT_ERROR", 92 "PA_ERROR_IND_RECEIVED", 93 "PA_INIT" 94}; 95 96static bool ufs_mtk_is_boost_crypt_enabled(struct ufs_hba *hba) 97{ 98 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 99 100 return host->caps & UFS_MTK_CAP_BOOST_CRYPT_ENGINE; 101} 102 103static bool ufs_mtk_is_va09_supported(struct ufs_hba *hba) 104{ 105 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 106 107 return host->caps & UFS_MTK_CAP_VA09_PWR_CTRL; 108} 109 110static bool ufs_mtk_is_broken_vcc(struct ufs_hba *hba) 111{ 112 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 113 114 return host->caps & UFS_MTK_CAP_BROKEN_VCC; 115} 116 117static bool ufs_mtk_is_pmc_via_fastauto(struct ufs_hba *hba) 118{ 119 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 120 121 return host->caps & UFS_MTK_CAP_PMC_VIA_FASTAUTO; 122} 123 124static bool ufs_mtk_is_tx_skew_fix(struct ufs_hba *hba) 125{ 126 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 127 128 return host->caps & UFS_MTK_CAP_TX_SKEW_FIX; 129} 130 131static bool ufs_mtk_is_rtff_mtcmos(struct ufs_hba *hba) 132{ 133 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 134 135 return host->caps & UFS_MTK_CAP_RTFF_MTCMOS; 136} 137 138static bool ufs_mtk_is_allow_vccqx_lpm(struct ufs_hba *hba) 139{ 140 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 141 142 return host->caps & UFS_MTK_CAP_ALLOW_VCCQX_LPM; 143} 144 145static bool ufs_mtk_is_clk_scale_ready(struct ufs_hba *hba) 146{ 147 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 148 struct ufs_mtk_clk *mclk = &host->mclk; 149 150 return mclk->ufs_sel_clki && 151 mclk->ufs_sel_max_clki && 152 mclk->ufs_sel_min_clki; 153} 154 155static void ufs_mtk_cfg_unipro_cg(struct ufs_hba *hba, bool enable) 156{ 157 u32 tmp; 158 159 if (enable) { 160 ufshcd_dme_get(hba, 161 UIC_ARG_MIB(VS_SAVEPOWERCONTROL), &tmp); 162 tmp = tmp | 163 (1 << RX_SYMBOL_CLK_GATE_EN) | 164 (1 << SYS_CLK_GATE_EN) | 165 (1 << TX_CLK_GATE_EN); 166 ufshcd_dme_set(hba, 167 UIC_ARG_MIB(VS_SAVEPOWERCONTROL), tmp); 168 169 ufshcd_dme_get(hba, 170 UIC_ARG_MIB(VS_DEBUGCLOCKENABLE), &tmp); 171 tmp = tmp & ~(1 << TX_SYMBOL_CLK_REQ_FORCE); 172 ufshcd_dme_set(hba, 173 UIC_ARG_MIB(VS_DEBUGCLOCKENABLE), tmp); 174 } else { 175 ufshcd_dme_get(hba, 176 UIC_ARG_MIB(VS_SAVEPOWERCONTROL), &tmp); 177 tmp = tmp & ~((1 << RX_SYMBOL_CLK_GATE_EN) | 178 (1 << SYS_CLK_GATE_EN) | 179 (1 << TX_CLK_GATE_EN)); 180 ufshcd_dme_set(hba, 181 UIC_ARG_MIB(VS_SAVEPOWERCONTROL), tmp); 182 183 ufshcd_dme_get(hba, 184 UIC_ARG_MIB(VS_DEBUGCLOCKENABLE), &tmp); 185 tmp = tmp | (1 << TX_SYMBOL_CLK_REQ_FORCE); 186 ufshcd_dme_set(hba, 187 UIC_ARG_MIB(VS_DEBUGCLOCKENABLE), tmp); 188 } 189} 190 191static void ufs_mtk_crypto_enable(struct ufs_hba *hba) 192{ 193 struct arm_smccc_res res; 194 195 ufs_mtk_crypto_ctrl(res, 1); 196 if (res.a0) { 197 dev_info(hba->dev, "%s: crypto enable failed, err: %lu\n", 198 __func__, res.a0); 199 hba->caps &= ~UFSHCD_CAP_CRYPTO; 200 } 201} 202 203static void ufs_mtk_host_reset(struct ufs_hba *hba) 204{ 205 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 206 struct arm_smccc_res res; 207 208 reset_control_assert(host->hci_reset); 209 reset_control_assert(host->crypto_reset); 210 reset_control_assert(host->unipro_reset); 211 reset_control_assert(host->mphy_reset); 212 213 usleep_range(100, 110); 214 215 reset_control_deassert(host->unipro_reset); 216 reset_control_deassert(host->crypto_reset); 217 reset_control_deassert(host->hci_reset); 218 reset_control_deassert(host->mphy_reset); 219 220 /* restore mphy setting aftre mphy reset */ 221 if (host->mphy_reset) 222 ufs_mtk_mphy_ctrl(UFS_MPHY_RESTORE, res); 223} 224 225static void ufs_mtk_init_reset_control(struct ufs_hba *hba, 226 struct reset_control **rc, 227 char *str) 228{ 229 *rc = devm_reset_control_get(hba->dev, str); 230 if (IS_ERR(*rc)) { 231 dev_info(hba->dev, "Failed to get reset control %s: %ld\n", 232 str, PTR_ERR(*rc)); 233 *rc = NULL; 234 } 235} 236 237static void ufs_mtk_init_reset(struct ufs_hba *hba) 238{ 239 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 240 241 ufs_mtk_init_reset_control(hba, &host->hci_reset, 242 "hci_rst"); 243 ufs_mtk_init_reset_control(hba, &host->unipro_reset, 244 "unipro_rst"); 245 ufs_mtk_init_reset_control(hba, &host->crypto_reset, 246 "crypto_rst"); 247 ufs_mtk_init_reset_control(hba, &host->mphy_reset, 248 "mphy_rst"); 249} 250 251static int ufs_mtk_hce_enable_notify(struct ufs_hba *hba, 252 enum ufs_notify_change_status status) 253{ 254 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 255 256 if (status == PRE_CHANGE) { 257 if (host->unipro_lpm) { 258 hba->vps->hba_enable_delay_us = 0; 259 } else { 260 hba->vps->hba_enable_delay_us = 600; 261 ufs_mtk_host_reset(hba); 262 } 263 264 if (hba->caps & UFSHCD_CAP_CRYPTO) 265 ufs_mtk_crypto_enable(hba); 266 267 if (host->caps & UFS_MTK_CAP_DISABLE_AH8) { 268 ufshcd_writel(hba, 0, 269 REG_AUTO_HIBERNATE_IDLE_TIMER); 270 hba->capabilities &= ~MASK_AUTO_HIBERN8_SUPPORT; 271 hba->ahit = 0; 272 } 273 274 /* 275 * Turn on CLK_CG early to bypass abnormal ERR_CHK signal 276 * to prevent host hang issue 277 */ 278 ufshcd_writel(hba, 279 ufshcd_readl(hba, REG_UFS_XOUFS_CTRL) | 0x80, 280 REG_UFS_XOUFS_CTRL); 281 282 if (host->legacy_ip_ver) 283 return 0; 284 285 /* DDR_EN setting */ 286 if (host->ip_ver >= IP_VER_MT6989) { 287 ufshcd_rmwl(hba, UFS_MASK(0x7FFF, 8), 288 0x453000, REG_UFS_MMIO_OPT_CTRL_0); 289 } 290 291 if (host->ip_ver >= IP_VER_MT6991_A0) { 292 /* Enable multi-rtt */ 293 ufshcd_rmwl(hba, MRTT_EN, MRTT_EN, REG_UFS_MMIO_OPT_CTRL_0); 294 /* Enable random performance improvement */ 295 ufshcd_rmwl(hba, RDN_PFM_IMPV_DIS, 0, REG_UFS_MMIO_OPT_CTRL_0); 296 } 297 } 298 299 return 0; 300} 301 302static int ufs_mtk_bind_mphy(struct ufs_hba *hba) 303{ 304 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 305 struct device *dev = hba->dev; 306 struct device_node *np = dev->of_node; 307 int err = 0; 308 309 host->mphy = devm_of_phy_get_by_index(dev, np, 0); 310 311 if (host->mphy == ERR_PTR(-EPROBE_DEFER)) { 312 /* 313 * UFS driver might be probed before the phy driver does. 314 * In that case we would like to return EPROBE_DEFER code. 315 */ 316 err = -EPROBE_DEFER; 317 dev_info(dev, 318 "%s: required phy hasn't probed yet. err = %d\n", 319 __func__, err); 320 } else if (IS_ERR(host->mphy)) { 321 err = PTR_ERR(host->mphy); 322 if (err != -ENODEV) { 323 dev_info(dev, "%s: PHY get failed %d\n", __func__, 324 err); 325 } 326 } 327 328 if (err) 329 host->mphy = NULL; 330 /* 331 * Allow unbound mphy because not every platform needs specific 332 * mphy control. 333 */ 334 if (err == -ENODEV) 335 err = 0; 336 337 return err; 338} 339 340static int ufs_mtk_setup_ref_clk(struct ufs_hba *hba, bool on) 341{ 342 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 343 struct arm_smccc_res res; 344 ktime_t timeout, time_checked; 345 u32 value; 346 347 if (host->ref_clk_enabled == on) 348 return 0; 349 350 ufs_mtk_ref_clk_notify(on, PRE_CHANGE, res); 351 352 if (on) { 353 ufshcd_writel(hba, REFCLK_REQUEST, REG_UFS_REFCLK_CTRL); 354 } else { 355 ufshcd_delay_us(host->ref_clk_gating_wait_us, 10); 356 ufshcd_writel(hba, REFCLK_RELEASE, REG_UFS_REFCLK_CTRL); 357 } 358 359 /* Wait for ack */ 360 timeout = ktime_add_us(ktime_get(), REFCLK_REQ_TIMEOUT_US); 361 do { 362 time_checked = ktime_get(); 363 value = ufshcd_readl(hba, REG_UFS_REFCLK_CTRL); 364 365 /* Wait until ack bit equals to req bit */ 366 if (((value & REFCLK_ACK) >> 1) == (value & REFCLK_REQUEST)) 367 goto out; 368 369 usleep_range(100, 200); 370 } while (ktime_before(time_checked, timeout)); 371 372 dev_err(hba->dev, "missing ack of refclk req, reg: 0x%x\n", value); 373 374 /* 375 * If clock on timeout, assume clock is off, notify tfa do clock 376 * off setting.(keep DIFN disable, release resource) 377 * If clock off timeout, assume clock will off finally, 378 * set ref_clk_enabled directly.(keep DIFN disable, keep resource) 379 */ 380 if (on) 381 ufs_mtk_ref_clk_notify(false, POST_CHANGE, res); 382 else 383 host->ref_clk_enabled = false; 384 385 return -ETIMEDOUT; 386 387out: 388 host->ref_clk_enabled = on; 389 if (on) 390 ufshcd_delay_us(host->ref_clk_ungating_wait_us, 10); 391 392 ufs_mtk_ref_clk_notify(on, POST_CHANGE, res); 393 394 return 0; 395} 396 397static void ufs_mtk_setup_ref_clk_wait_us(struct ufs_hba *hba, 398 u16 gating_us) 399{ 400 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 401 402 if (hba->dev_info.clk_gating_wait_us) { 403 host->ref_clk_gating_wait_us = 404 hba->dev_info.clk_gating_wait_us; 405 } else { 406 host->ref_clk_gating_wait_us = gating_us; 407 } 408 409 host->ref_clk_ungating_wait_us = REFCLK_DEFAULT_WAIT_US; 410} 411 412static void ufs_mtk_dbg_sel(struct ufs_hba *hba) 413{ 414 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 415 416 if (!host->legacy_ip_ver && host->ip_ver >= IP_VER_MT6983) { 417 ufshcd_writel(hba, 0x820820, REG_UFS_DEBUG_SEL); 418 ufshcd_writel(hba, 0x0, REG_UFS_DEBUG_SEL_B0); 419 ufshcd_writel(hba, 0x55555555, REG_UFS_DEBUG_SEL_B1); 420 ufshcd_writel(hba, 0xaaaaaaaa, REG_UFS_DEBUG_SEL_B2); 421 ufshcd_writel(hba, 0xffffffff, REG_UFS_DEBUG_SEL_B3); 422 } else { 423 ufshcd_writel(hba, 0x20, REG_UFS_DEBUG_SEL); 424 } 425} 426 427static int ufs_mtk_wait_idle_state(struct ufs_hba *hba, 428 unsigned long retry_ms) 429{ 430 u64 timeout, time_checked; 431 u32 val, sm; 432 bool wait_idle; 433 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 434 435 /* cannot use plain ktime_get() in suspend */ 436 timeout = ktime_get_mono_fast_ns() + retry_ms * 1000000UL; 437 438 /* wait a specific time after check base */ 439 udelay(10); 440 wait_idle = false; 441 442 do { 443 time_checked = ktime_get_mono_fast_ns(); 444 if (host->legacy_ip_ver || host->ip_ver < IP_VER_MT6899) { 445 ufs_mtk_dbg_sel(hba); 446 val = ufshcd_readl(hba, REG_UFS_PROBE); 447 } else { 448 val = ufshcd_readl(hba, REG_UFS_UFS_MMIO_OTSD_CTRL); 449 val = val >> 16; 450 } 451 452 sm = val & 0x1f; 453 454 /* 455 * if state is in H8 enter and H8 enter confirm 456 * wait until return to idle state. 457 */ 458 if ((sm >= VS_HIB_ENTER) && (sm <= VS_HIB_EXIT)) { 459 wait_idle = true; 460 udelay(50); 461 continue; 462 } else if (!wait_idle) 463 break; 464 465 if (wait_idle && (sm == VS_HCE_BASE)) 466 break; 467 } while (time_checked < timeout); 468 469 if (wait_idle && sm != VS_HCE_BASE) { 470 dev_info(hba->dev, "wait idle tmo: 0x%x\n", val); 471 return -ETIMEDOUT; 472 } 473 474 return 0; 475} 476 477static int ufs_mtk_wait_link_state(struct ufs_hba *hba, u32 state, 478 unsigned long max_wait_ms) 479{ 480 ktime_t timeout, time_checked; 481 u32 val; 482 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 483 484 timeout = ktime_add_ms(ktime_get(), max_wait_ms); 485 do { 486 time_checked = ktime_get(); 487 488 if (host->legacy_ip_ver || host->ip_ver < IP_VER_MT6899) { 489 ufs_mtk_dbg_sel(hba); 490 val = ufshcd_readl(hba, REG_UFS_PROBE); 491 val = val >> 28; 492 } else { 493 val = ufshcd_readl(hba, REG_UFS_UFS_MMIO_OTSD_CTRL); 494 val = val >> 24; 495 } 496 497 if (val == state) 498 return 0; 499 500 /* Sleep for max. 200us */ 501 usleep_range(100, 200); 502 } while (ktime_before(time_checked, timeout)); 503 504 return -ETIMEDOUT; 505} 506 507static int ufs_mtk_mphy_power_on(struct ufs_hba *hba, bool on) 508{ 509 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 510 struct phy *mphy = host->mphy; 511 struct arm_smccc_res res; 512 int ret = 0; 513 514 if (!mphy || !(on ^ host->mphy_powered_on)) 515 return 0; 516 517 if (on) { 518 if (ufs_mtk_is_va09_supported(hba)) { 519 ret = regulator_enable(host->reg_va09); 520 if (ret < 0) 521 goto out; 522 /* wait 200 us to stablize VA09 */ 523 usleep_range(200, 210); 524 ufs_mtk_va09_pwr_ctrl(res, 1); 525 } 526 phy_power_on(mphy); 527 } else { 528 phy_power_off(mphy); 529 if (ufs_mtk_is_va09_supported(hba)) { 530 ufs_mtk_va09_pwr_ctrl(res, 0); 531 ret = regulator_disable(host->reg_va09); 532 } 533 } 534out: 535 if (ret) { 536 dev_info(hba->dev, 537 "failed to %s va09: %d\n", 538 on ? "enable" : "disable", 539 ret); 540 } else { 541 host->mphy_powered_on = on; 542 } 543 544 return ret; 545} 546 547static int ufs_mtk_get_host_clk(struct device *dev, const char *name, 548 struct clk **clk_out) 549{ 550 struct clk *clk; 551 int err = 0; 552 553 clk = devm_clk_get(dev, name); 554 if (IS_ERR(clk)) 555 err = PTR_ERR(clk); 556 else 557 *clk_out = clk; 558 559 return err; 560} 561 562static void ufs_mtk_boost_crypt(struct ufs_hba *hba, bool boost) 563{ 564 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 565 struct ufs_mtk_crypt_cfg *cfg; 566 struct regulator *reg; 567 int volt, ret; 568 569 if (!ufs_mtk_is_boost_crypt_enabled(hba)) 570 return; 571 572 cfg = host->crypt; 573 volt = cfg->vcore_volt; 574 reg = cfg->reg_vcore; 575 576 ret = clk_prepare_enable(cfg->clk_crypt_mux); 577 if (ret) { 578 dev_info(hba->dev, "clk_prepare_enable(): %d\n", 579 ret); 580 return; 581 } 582 583 if (boost) { 584 ret = regulator_set_voltage(reg, volt, INT_MAX); 585 if (ret) { 586 dev_info(hba->dev, 587 "failed to set vcore to %d\n", volt); 588 goto out; 589 } 590 591 ret = clk_set_parent(cfg->clk_crypt_mux, 592 cfg->clk_crypt_perf); 593 if (ret) { 594 dev_info(hba->dev, 595 "failed to set clk_crypt_perf\n"); 596 regulator_set_voltage(reg, 0, INT_MAX); 597 goto out; 598 } 599 } else { 600 ret = clk_set_parent(cfg->clk_crypt_mux, 601 cfg->clk_crypt_lp); 602 if (ret) { 603 dev_info(hba->dev, 604 "failed to set clk_crypt_lp\n"); 605 goto out; 606 } 607 608 ret = regulator_set_voltage(reg, 0, INT_MAX); 609 if (ret) { 610 dev_info(hba->dev, 611 "failed to set vcore to MIN\n"); 612 } 613 } 614out: 615 clk_disable_unprepare(cfg->clk_crypt_mux); 616} 617 618static int ufs_mtk_init_host_clk(struct ufs_hba *hba, const char *name, 619 struct clk **clk) 620{ 621 int ret; 622 623 ret = ufs_mtk_get_host_clk(hba->dev, name, clk); 624 if (ret) { 625 dev_info(hba->dev, "%s: failed to get %s: %d", __func__, 626 name, ret); 627 } 628 629 return ret; 630} 631 632static void ufs_mtk_init_boost_crypt(struct ufs_hba *hba) 633{ 634 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 635 struct ufs_mtk_crypt_cfg *cfg; 636 struct device *dev = hba->dev; 637 struct regulator *reg; 638 u32 volt; 639 640 host->crypt = devm_kzalloc(dev, sizeof(*(host->crypt)), 641 GFP_KERNEL); 642 if (!host->crypt) 643 goto disable_caps; 644 645 reg = devm_regulator_get_optional(dev, "dvfsrc-vcore"); 646 if (IS_ERR(reg)) { 647 dev_info(dev, "failed to get dvfsrc-vcore: %ld", 648 PTR_ERR(reg)); 649 goto disable_caps; 650 } 651 652 if (of_property_read_u32(dev->of_node, "boost-crypt-vcore-min", 653 &volt)) { 654 dev_info(dev, "failed to get boost-crypt-vcore-min"); 655 goto disable_caps; 656 } 657 658 cfg = host->crypt; 659 if (ufs_mtk_init_host_clk(hba, "crypt_mux", 660 &cfg->clk_crypt_mux)) 661 goto disable_caps; 662 663 if (ufs_mtk_init_host_clk(hba, "crypt_lp", 664 &cfg->clk_crypt_lp)) 665 goto disable_caps; 666 667 if (ufs_mtk_init_host_clk(hba, "crypt_perf", 668 &cfg->clk_crypt_perf)) 669 goto disable_caps; 670 671 cfg->reg_vcore = reg; 672 cfg->vcore_volt = volt; 673 host->caps |= UFS_MTK_CAP_BOOST_CRYPT_ENGINE; 674 675disable_caps: 676 return; 677} 678 679static void ufs_mtk_init_va09_pwr_ctrl(struct ufs_hba *hba) 680{ 681 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 682 683 host->reg_va09 = regulator_get(hba->dev, "va09"); 684 if (IS_ERR(host->reg_va09)) 685 dev_info(hba->dev, "failed to get va09"); 686 else 687 host->caps |= UFS_MTK_CAP_VA09_PWR_CTRL; 688} 689 690static void ufs_mtk_init_host_caps(struct ufs_hba *hba) 691{ 692 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 693 struct device_node *np = hba->dev->of_node; 694 695 if (of_property_read_bool(np, "mediatek,ufs-boost-crypt")) 696 ufs_mtk_init_boost_crypt(hba); 697 698 if (of_property_read_bool(np, "mediatek,ufs-support-va09")) 699 ufs_mtk_init_va09_pwr_ctrl(hba); 700 701 if (of_property_read_bool(np, "mediatek,ufs-disable-ah8")) 702 host->caps |= UFS_MTK_CAP_DISABLE_AH8; 703 704 if (of_property_read_bool(np, "mediatek,ufs-broken-vcc")) 705 host->caps |= UFS_MTK_CAP_BROKEN_VCC; 706 707 if (of_property_read_bool(np, "mediatek,ufs-pmc-via-fastauto")) 708 host->caps |= UFS_MTK_CAP_PMC_VIA_FASTAUTO; 709 710 if (of_property_read_bool(np, "mediatek,ufs-tx-skew-fix")) 711 host->caps |= UFS_MTK_CAP_TX_SKEW_FIX; 712 713 if (of_property_read_bool(np, "mediatek,ufs-disable-mcq")) 714 host->caps |= UFS_MTK_CAP_DISABLE_MCQ; 715 716 if (of_property_read_bool(np, "mediatek,ufs-rtff-mtcmos")) 717 host->caps |= UFS_MTK_CAP_RTFF_MTCMOS; 718 719 if (of_property_read_bool(np, "mediatek,ufs-broken-rtc")) 720 host->caps |= UFS_MTK_CAP_MCQ_BROKEN_RTC; 721 722 dev_info(hba->dev, "caps: 0x%x", host->caps); 723} 724 725static void ufs_mtk_scale_perf(struct ufs_hba *hba, bool scale_up) 726{ 727 ufs_mtk_boost_crypt(hba, scale_up); 728} 729 730static void ufs_mtk_pwr_ctrl(struct ufs_hba *hba, bool on) 731{ 732 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 733 734 if (on) { 735 phy_power_on(host->mphy); 736 ufs_mtk_setup_ref_clk(hba, on); 737 if (!ufshcd_is_clkscaling_supported(hba)) 738 ufs_mtk_scale_perf(hba, on); 739 } else { 740 if (!ufshcd_is_clkscaling_supported(hba)) 741 ufs_mtk_scale_perf(hba, on); 742 ufs_mtk_setup_ref_clk(hba, on); 743 phy_power_off(host->mphy); 744 } 745} 746 747static void ufs_mtk_mcq_disable_irq(struct ufs_hba *hba) 748{ 749 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 750 u32 irq, i; 751 752 if (!hba->mcq_enabled) 753 return; 754 755 if (host->mcq_nr_intr == 0) 756 return; 757 758 for (i = 0; i < host->mcq_nr_intr; i++) { 759 irq = host->mcq_intr_info[i].irq; 760 disable_irq(irq); 761 } 762 host->is_mcq_intr_enabled = false; 763} 764 765static void ufs_mtk_mcq_enable_irq(struct ufs_hba *hba) 766{ 767 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 768 u32 irq, i; 769 770 if (!hba->mcq_enabled) 771 return; 772 773 if (host->mcq_nr_intr == 0) 774 return; 775 776 if (host->is_mcq_intr_enabled == true) 777 return; 778 779 for (i = 0; i < host->mcq_nr_intr; i++) { 780 irq = host->mcq_intr_info[i].irq; 781 enable_irq(irq); 782 } 783 host->is_mcq_intr_enabled = true; 784} 785 786/** 787 * ufs_mtk_setup_clocks - enables/disable clocks 788 * @hba: host controller instance 789 * @on: If true, enable clocks else disable them. 790 * @status: PRE_CHANGE or POST_CHANGE notify 791 * 792 * Return: 0 on success, non-zero on failure. 793 */ 794static int ufs_mtk_setup_clocks(struct ufs_hba *hba, bool on, 795 enum ufs_notify_change_status status) 796{ 797 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 798 bool clk_pwr_off = false; 799 int ret = 0; 800 801 /* 802 * In case ufs_mtk_init() is not yet done, simply ignore. 803 * This ufs_mtk_setup_clocks() shall be called from 804 * ufs_mtk_init() after init is done. 805 */ 806 if (!host) 807 return 0; 808 809 if (!on && status == PRE_CHANGE) { 810 if (ufshcd_is_link_off(hba)) { 811 clk_pwr_off = true; 812 } else if (ufshcd_is_link_hibern8(hba) || 813 (!ufshcd_can_hibern8_during_gating(hba) && 814 ufshcd_is_auto_hibern8_enabled(hba))) { 815 /* 816 * Gate ref-clk and poweroff mphy if link state is in 817 * OFF or Hibern8 by either Auto-Hibern8 or 818 * ufshcd_link_state_transition(). 819 */ 820 ret = ufs_mtk_wait_link_state(hba, 821 VS_LINK_HIBERN8, 822 15); 823 if (!ret) 824 clk_pwr_off = true; 825 } 826 827 if (clk_pwr_off) { 828 ufs_mtk_pwr_ctrl(hba, false); 829 } else { 830 dev_warn(hba->dev, "Clock is not turned off, hba->ahit = 0x%x, AHIT = 0x%x\n", 831 hba->ahit, 832 ufshcd_readl(hba, 833 REG_AUTO_HIBERNATE_IDLE_TIMER)); 834 } 835 ufs_mtk_mcq_disable_irq(hba); 836 } else if (on && status == POST_CHANGE) { 837 ufs_mtk_pwr_ctrl(hba, true); 838 ufs_mtk_mcq_enable_irq(hba); 839 } 840 841 return ret; 842} 843 844static u32 ufs_mtk_mcq_get_irq(struct ufs_hba *hba, unsigned int cpu) 845{ 846 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 847 struct blk_mq_tag_set *tag_set = &hba->host->tag_set; 848 struct blk_mq_queue_map *map = &tag_set->map[HCTX_TYPE_DEFAULT]; 849 unsigned int nr = map->nr_queues; 850 unsigned int q_index; 851 852 q_index = map->mq_map[cpu]; 853 if (q_index >= nr) { 854 dev_err(hba->dev, "hwq index %d exceed %d\n", 855 q_index, nr); 856 return MTK_MCQ_INVALID_IRQ; 857 } 858 859 return host->mcq_intr_info[q_index].irq; 860} 861 862static void ufs_mtk_mcq_set_irq_affinity(struct ufs_hba *hba, unsigned int cpu) 863{ 864 unsigned int irq, _cpu; 865 int ret; 866 867 irq = ufs_mtk_mcq_get_irq(hba, cpu); 868 if (irq == MTK_MCQ_INVALID_IRQ) { 869 dev_err(hba->dev, "invalid irq. unable to bind irq to cpu%d", cpu); 870 return; 871 } 872 873 /* force migrate irq of cpu0 to cpu3 */ 874 _cpu = (cpu == 0) ? 3 : cpu; 875 ret = irq_set_affinity(irq, cpumask_of(_cpu)); 876 if (ret) { 877 dev_err(hba->dev, "set irq %d affinity to CPU %d failed\n", 878 irq, _cpu); 879 return; 880 } 881 dev_info(hba->dev, "set irq %d affinity to CPU: %d\n", irq, _cpu); 882} 883 884static bool ufs_mtk_is_legacy_chipset(struct ufs_hba *hba, u32 hw_ip_ver) 885{ 886 bool is_legacy = false; 887 888 switch (hw_ip_ver) { 889 case IP_LEGACY_VER_MT6893: 890 case IP_LEGACY_VER_MT6781: 891 /* can add other legacy chipset ID here accordingly */ 892 is_legacy = true; 893 break; 894 default: 895 break; 896 } 897 dev_info(hba->dev, "legacy IP version - 0x%x, is legacy : %d", hw_ip_ver, is_legacy); 898 899 return is_legacy; 900} 901 902/* 903 * HW version format has been changed from 01MMmmmm to 1MMMmmmm, since 904 * project MT6878. In order to perform correct version comparison, 905 * version number is changed by SW for the following projects. 906 * IP_VER_MT6983 0x00360000 to 0x10360000 907 * IP_VER_MT6897 0x01440000 to 0x10440000 908 * IP_VER_MT6989 0x01450000 to 0x10450000 909 * IP_VER_MT6991 0x01460000 to 0x10460000 910 */ 911static void ufs_mtk_get_hw_ip_version(struct ufs_hba *hba) 912{ 913 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 914 u32 hw_ip_ver; 915 916 hw_ip_ver = ufshcd_readl(hba, REG_UFS_MTK_IP_VER); 917 918 if (((hw_ip_ver & (0xFF << 24)) == (0x1 << 24)) || 919 ((hw_ip_ver & (0xFF << 24)) == 0)) { 920 hw_ip_ver &= ~(0xFF << 24); 921 hw_ip_ver |= (0x1 << 28); 922 } 923 924 host->ip_ver = hw_ip_ver; 925 926 host->legacy_ip_ver = ufs_mtk_is_legacy_chipset(hba, hw_ip_ver); 927} 928 929static void ufs_mtk_get_controller_version(struct ufs_hba *hba) 930{ 931 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 932 int ret, ver = 0; 933 934 if (host->hw_ver.major) 935 return; 936 937 /* Set default (minimum) version anyway */ 938 host->hw_ver.major = 2; 939 940 ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_LOCALVERINFO), &ver); 941 if (!ret) { 942 if (ver >= UFS_UNIPRO_VER_1_8) { 943 host->hw_ver.major = 3; 944 /* 945 * Fix HCI version for some platforms with 946 * incorrect version 947 */ 948 if (hba->ufs_version < ufshci_version(3, 0)) 949 hba->ufs_version = ufshci_version(3, 0); 950 } 951 } 952} 953 954static u32 ufs_mtk_get_ufs_hci_version(struct ufs_hba *hba) 955{ 956 return hba->ufs_version; 957} 958 959/** 960 * ufs_mtk_init_clocks - Init mtk driver private clocks 961 * 962 * @hba: per adapter instance 963 */ 964static void ufs_mtk_init_clocks(struct ufs_hba *hba) 965{ 966 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 967 struct list_head *head = &hba->clk_list_head; 968 struct ufs_clk_info *clki, *clki_tmp; 969 struct device *dev = hba->dev; 970 struct regulator *reg; 971 u32 volt; 972 973 /* 974 * Find private clocks and store them in struct ufs_mtk_clk. 975 * Remove "ufs_sel_min_src" and "ufs_sel_min_src" from list to avoid 976 * being switched on/off in clock gating. 977 */ 978 list_for_each_entry_safe(clki, clki_tmp, head, list) { 979 if (!strcmp(clki->name, "ufs_sel")) { 980 host->mclk.ufs_sel_clki = clki; 981 } else if (!strcmp(clki->name, "ufs_sel_max_src")) { 982 host->mclk.ufs_sel_max_clki = clki; 983 clk_disable_unprepare(clki->clk); 984 list_del(&clki->list); 985 } else if (!strcmp(clki->name, "ufs_sel_min_src")) { 986 host->mclk.ufs_sel_min_clki = clki; 987 clk_disable_unprepare(clki->clk); 988 list_del(&clki->list); 989 } else if (!strcmp(clki->name, "ufs_fde")) { 990 host->mclk.ufs_fde_clki = clki; 991 } else if (!strcmp(clki->name, "ufs_fde_max_src")) { 992 host->mclk.ufs_fde_max_clki = clki; 993 clk_disable_unprepare(clki->clk); 994 list_del(&clki->list); 995 } else if (!strcmp(clki->name, "ufs_fde_min_src")) { 996 host->mclk.ufs_fde_min_clki = clki; 997 clk_disable_unprepare(clki->clk); 998 list_del(&clki->list); 999 } 1000 } 1001 1002 list_for_each_entry(clki, head, list) { 1003 dev_info(hba->dev, "clk \"%s\" present", clki->name); 1004 } 1005 1006 if (!ufs_mtk_is_clk_scale_ready(hba)) { 1007 hba->caps &= ~UFSHCD_CAP_CLK_SCALING; 1008 dev_info(hba->dev, 1009 "%s: Clk-scaling not ready. Feature disabled.", 1010 __func__); 1011 return; 1012 } 1013 1014 /* 1015 * Default get vcore if dts have these settings. 1016 * No matter clock scaling support or not. (may disable by customer) 1017 */ 1018 reg = devm_regulator_get_optional(dev, "dvfsrc-vcore"); 1019 if (IS_ERR(reg)) { 1020 dev_info(dev, "failed to get dvfsrc-vcore: %ld", 1021 PTR_ERR(reg)); 1022 return; 1023 } 1024 1025 if (of_property_read_u32(dev->of_node, "clk-scale-up-vcore-min", 1026 &volt)) { 1027 dev_info(dev, "failed to get clk-scale-up-vcore-min"); 1028 return; 1029 } 1030 1031 host->mclk.reg_vcore = reg; 1032 host->mclk.vcore_volt = volt; 1033 1034 /* If default boot is max gear, request vcore */ 1035 if (reg && volt && host->clk_scale_up) { 1036 if (regulator_set_voltage(reg, volt, INT_MAX)) { 1037 dev_info(hba->dev, 1038 "Failed to set vcore to %d\n", volt); 1039 } 1040 } 1041} 1042 1043#define MAX_VCC_NAME 30 1044static int ufs_mtk_vreg_fix_vcc(struct ufs_hba *hba) 1045{ 1046 struct ufs_vreg_info *info = &hba->vreg_info; 1047 struct device_node *np = hba->dev->of_node; 1048 struct device *dev = hba->dev; 1049 char vcc_name[MAX_VCC_NAME]; 1050 struct arm_smccc_res res; 1051 int err, ver; 1052 1053 if (info->vcc) 1054 return 0; 1055 1056 if (of_property_read_bool(np, "mediatek,ufs-vcc-by-num")) { 1057 ufs_mtk_get_vcc_num(res); 1058 if (res.a1 > UFS_VCC_NONE && res.a1 < UFS_VCC_MAX) 1059 snprintf(vcc_name, MAX_VCC_NAME, "vcc-opt%lu", res.a1); 1060 else 1061 return -ENODEV; 1062 } else if (of_property_read_bool(np, "mediatek,ufs-vcc-by-ver")) { 1063 ver = (hba->dev_info.wspecversion & 0xF00) >> 8; 1064 snprintf(vcc_name, MAX_VCC_NAME, "vcc-ufs%u", ver); 1065 } else { 1066 return 0; 1067 } 1068 1069 err = ufshcd_populate_vreg(dev, vcc_name, &info->vcc, false); 1070 if (err) 1071 return err; 1072 1073 err = ufshcd_get_vreg(dev, info->vcc); 1074 if (err) 1075 return err; 1076 1077 err = regulator_enable(info->vcc->reg); 1078 if (!err) { 1079 info->vcc->enabled = true; 1080 dev_info(dev, "%s: %s enabled\n", __func__, vcc_name); 1081 } 1082 1083 return err; 1084} 1085 1086static void ufs_mtk_vreg_fix_vccqx(struct ufs_hba *hba) 1087{ 1088 struct ufs_vreg_info *info = &hba->vreg_info; 1089 struct ufs_vreg **vreg_on, **vreg_off; 1090 1091 if (hba->dev_info.wspecversion >= 0x0300) { 1092 vreg_on = &info->vccq; 1093 vreg_off = &info->vccq2; 1094 } else { 1095 vreg_on = &info->vccq2; 1096 vreg_off = &info->vccq; 1097 } 1098 1099 if (*vreg_on) 1100 (*vreg_on)->always_on = true; 1101 1102 if (*vreg_off) { 1103 regulator_disable((*vreg_off)->reg); 1104 devm_kfree(hba->dev, (*vreg_off)->name); 1105 devm_kfree(hba->dev, *vreg_off); 1106 *vreg_off = NULL; 1107 } 1108} 1109 1110static void ufs_mtk_setup_clk_gating(struct ufs_hba *hba) 1111{ 1112 unsigned long flags; 1113 u32 ah_ms = 10; 1114 u32 ah_scale, ah_timer; 1115 u32 scale_us[] = {1, 10, 100, 1000, 10000, 100000}; 1116 1117 if (ufshcd_is_clkgating_allowed(hba)) { 1118 if (ufshcd_is_auto_hibern8_supported(hba) && hba->ahit) { 1119 ah_scale = FIELD_GET(UFSHCI_AHIBERN8_SCALE_MASK, 1120 hba->ahit); 1121 ah_timer = FIELD_GET(UFSHCI_AHIBERN8_TIMER_MASK, 1122 hba->ahit); 1123 if (ah_scale <= 5) 1124 ah_ms = ah_timer * scale_us[ah_scale] / 1000; 1125 } 1126 1127 spin_lock_irqsave(hba->host->host_lock, flags); 1128 hba->clk_gating.delay_ms = max(ah_ms, 10U); 1129 spin_unlock_irqrestore(hba->host->host_lock, flags); 1130 } 1131} 1132 1133static void ufs_mtk_fix_ahit(struct ufs_hba *hba) 1134{ 1135 unsigned int us; 1136 1137 if (ufshcd_is_auto_hibern8_supported(hba)) { 1138 switch (hba->dev_info.wmanufacturerid) { 1139 case UFS_VENDOR_SAMSUNG: 1140 /* configure auto-hibern8 timer to 3.5 ms */ 1141 us = 3500; 1142 break; 1143 1144 case UFS_VENDOR_MICRON: 1145 /* configure auto-hibern8 timer to 2 ms */ 1146 us = 2000; 1147 break; 1148 1149 default: 1150 /* configure auto-hibern8 timer to 1 ms */ 1151 us = 1000; 1152 break; 1153 } 1154 1155 hba->ahit = ufshcd_us_to_ahit(us); 1156 } 1157 1158 ufs_mtk_setup_clk_gating(hba); 1159} 1160 1161static void ufs_mtk_fix_clock_scaling(struct ufs_hba *hba) 1162{ 1163 /* UFS version is below 4.0, clock scaling is not necessary */ 1164 if ((hba->dev_info.wspecversion < 0x0400) && 1165 ufs_mtk_is_clk_scale_ready(hba)) { 1166 hba->caps &= ~UFSHCD_CAP_CLK_SCALING; 1167 1168 _ufs_mtk_clk_scale(hba, false); 1169 } 1170} 1171 1172static void ufs_mtk_init_mcq_irq(struct ufs_hba *hba) 1173{ 1174 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 1175 struct platform_device *pdev; 1176 int i; 1177 int irq; 1178 1179 host->mcq_nr_intr = UFSHCD_MAX_Q_NR; 1180 pdev = container_of(hba->dev, struct platform_device, dev); 1181 1182 if (host->caps & UFS_MTK_CAP_DISABLE_MCQ) 1183 goto failed; 1184 1185 for (i = 0; i < host->mcq_nr_intr; i++) { 1186 /* irq index 0 is legacy irq, sq/cq irq start from index 1 */ 1187 irq = platform_get_irq(pdev, i + 1); 1188 if (irq < 0) { 1189 host->mcq_intr_info[i].irq = MTK_MCQ_INVALID_IRQ; 1190 goto failed; 1191 } 1192 host->mcq_intr_info[i].hba = hba; 1193 host->mcq_intr_info[i].irq = irq; 1194 dev_info(hba->dev, "get platform mcq irq: %d, %d\n", i, irq); 1195 } 1196 1197 return; 1198failed: 1199 /* invalidate irq info */ 1200 for (i = 0; i < host->mcq_nr_intr; i++) 1201 host->mcq_intr_info[i].irq = MTK_MCQ_INVALID_IRQ; 1202 1203 host->mcq_nr_intr = 0; 1204} 1205 1206/** 1207 * ufs_mtk_init - find other essential mmio bases 1208 * @hba: host controller instance 1209 * 1210 * Binds PHY with controller and powers up PHY enabling clocks 1211 * and regulators. 1212 * 1213 * Return: -EPROBE_DEFER if binding fails, returns negative error 1214 * on phy power up failure and returns zero on success. 1215 */ 1216static int ufs_mtk_init(struct ufs_hba *hba) 1217{ 1218 const struct of_device_id *id; 1219 struct device *dev = hba->dev; 1220 struct ufs_mtk_host *host; 1221 struct Scsi_Host *shost = hba->host; 1222 int err = 0; 1223 struct arm_smccc_res res; 1224 1225 host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL); 1226 if (!host) { 1227 err = -ENOMEM; 1228 dev_info(dev, "%s: no memory for mtk ufs host\n", __func__); 1229 goto out; 1230 } 1231 1232 host->hba = hba; 1233 ufshcd_set_variant(hba, host); 1234 1235 id = of_match_device(ufs_mtk_of_match, dev); 1236 if (!id) { 1237 err = -EINVAL; 1238 goto out; 1239 } 1240 1241 /* Initialize host capability */ 1242 ufs_mtk_init_host_caps(hba); 1243 1244 ufs_mtk_init_mcq_irq(hba); 1245 1246 err = ufs_mtk_bind_mphy(hba); 1247 if (err) 1248 goto out_variant_clear; 1249 1250 ufs_mtk_init_reset(hba); 1251 1252 /* backup mphy setting if mphy can reset */ 1253 if (host->mphy_reset) 1254 ufs_mtk_mphy_ctrl(UFS_MPHY_BACKUP, res); 1255 1256 /* Enable runtime autosuspend */ 1257 hba->caps |= UFSHCD_CAP_RPM_AUTOSUSPEND; 1258 1259 /* Enable clock-gating */ 1260 hba->caps |= UFSHCD_CAP_CLK_GATING; 1261 1262 /* Enable inline encryption */ 1263 hba->caps |= UFSHCD_CAP_CRYPTO; 1264 1265 /* Enable WriteBooster */ 1266 hba->caps |= UFSHCD_CAP_WB_EN; 1267 1268 /* Enable clk scaling*/ 1269 hba->caps |= UFSHCD_CAP_CLK_SCALING; 1270 host->clk_scale_up = true; /* default is max freq */ 1271 1272 /* Set runtime pm delay to replace default */ 1273 shost->rpm_autosuspend_delay = MTK_RPM_AUTOSUSPEND_DELAY_MS; 1274 1275 hba->quirks |= UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL; 1276 1277 hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_INTR; 1278 if (host->caps & UFS_MTK_CAP_MCQ_BROKEN_RTC) 1279 hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_RTC; 1280 1281 hba->vps->wb_flush_threshold = UFS_WB_BUF_REMAIN_PERCENT(80); 1282 1283 if (host->caps & UFS_MTK_CAP_DISABLE_AH8) 1284 hba->caps |= UFSHCD_CAP_HIBERN8_WITH_CLK_GATING; 1285 1286 if (host->caps & UFS_MTK_CAP_DISABLE_MCQ) 1287 hba->quirks |= UFSHCD_QUIRK_BROKEN_LSDBS_CAP; 1288 1289 ufs_mtk_init_clocks(hba); 1290 1291 /* 1292 * ufshcd_vops_init() is invoked after 1293 * ufshcd_setup_clock(true) in ufshcd_hba_init() thus 1294 * phy clock setup is skipped. 1295 * 1296 * Enable phy clocks specifically here. 1297 */ 1298 ufs_mtk_mphy_power_on(hba, true); 1299 1300 if (ufs_mtk_is_rtff_mtcmos(hba)) { 1301 /* First Restore here, to avoid backup unexpected value */ 1302 ufs_mtk_mtcmos_ctrl(false, res); 1303 1304 /* Power on to init */ 1305 ufs_mtk_mtcmos_ctrl(true, res); 1306 } 1307 1308 ufs_mtk_setup_clocks(hba, true, POST_CHANGE); 1309 1310 ufs_mtk_get_hw_ip_version(hba); 1311 1312 goto out; 1313 1314out_variant_clear: 1315 ufshcd_set_variant(hba, NULL); 1316out: 1317 return err; 1318} 1319 1320static bool ufs_mtk_pmc_via_fastauto(struct ufs_hba *hba, 1321 struct ufs_pa_layer_attr *dev_req_params) 1322{ 1323 if (!ufs_mtk_is_pmc_via_fastauto(hba)) 1324 return false; 1325 1326 if (dev_req_params->hs_rate == hba->pwr_info.hs_rate) 1327 return false; 1328 1329 if (dev_req_params->pwr_tx != FAST_MODE && 1330 dev_req_params->gear_tx < UFS_HS_G4) 1331 return false; 1332 1333 if (dev_req_params->pwr_rx != FAST_MODE && 1334 dev_req_params->gear_rx < UFS_HS_G4) 1335 return false; 1336 1337 if (dev_req_params->pwr_tx == SLOW_MODE || 1338 dev_req_params->pwr_rx == SLOW_MODE) 1339 return false; 1340 1341 return true; 1342} 1343 1344static void ufs_mtk_adjust_sync_length(struct ufs_hba *hba) 1345{ 1346 int i; 1347 u32 value; 1348 u32 cnt, att, min; 1349 struct attr_min { 1350 u32 attr; 1351 u32 min_value; 1352 } pa_min_sync_length[] = { 1353 {PA_TXHSG1SYNCLENGTH, 0x48}, 1354 {PA_TXHSG2SYNCLENGTH, 0x48}, 1355 {PA_TXHSG3SYNCLENGTH, 0x48}, 1356 {PA_TXHSG4SYNCLENGTH, 0x48}, 1357 {PA_TXHSG5SYNCLENGTH, 0x48} 1358 }; 1359 1360 cnt = sizeof(pa_min_sync_length) / sizeof(struct attr_min); 1361 for (i = 0; i < cnt; i++) { 1362 att = pa_min_sync_length[i].attr; 1363 min = pa_min_sync_length[i].min_value; 1364 ufshcd_dme_get(hba, UIC_ARG_MIB(att), &value); 1365 if (value < min) 1366 ufshcd_dme_set(hba, UIC_ARG_MIB(att), min); 1367 1368 ufshcd_dme_peer_get(hba, UIC_ARG_MIB(att), &value); 1369 if (value < min) 1370 ufshcd_dme_peer_set(hba, UIC_ARG_MIB(att), min); 1371 } 1372} 1373 1374static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba, 1375 const struct ufs_pa_layer_attr *dev_max_params, 1376 struct ufs_pa_layer_attr *dev_req_params) 1377{ 1378 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 1379 struct ufs_host_params host_params; 1380 int ret; 1381 1382 ufshcd_init_host_params(&host_params); 1383 host_params.hs_rx_gear = UFS_HS_G5; 1384 host_params.hs_tx_gear = UFS_HS_G5; 1385 1386 if (dev_max_params->pwr_rx == SLOW_MODE || 1387 dev_max_params->pwr_tx == SLOW_MODE) 1388 host_params.desired_working_mode = UFS_PWM_MODE; 1389 1390 ret = ufshcd_negotiate_pwr_params(&host_params, dev_max_params, dev_req_params); 1391 if (ret) { 1392 pr_info("%s: failed to determine capabilities\n", 1393 __func__); 1394 } 1395 1396 if (ufs_mtk_pmc_via_fastauto(hba, dev_req_params)) { 1397 ufs_mtk_adjust_sync_length(hba); 1398 1399 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXTERMINATION), true); 1400 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXGEAR), UFS_HS_G1); 1401 1402 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXTERMINATION), true); 1403 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXGEAR), UFS_HS_G1); 1404 1405 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_ACTIVETXDATALANES), 1406 dev_req_params->lane_tx); 1407 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_ACTIVERXDATALANES), 1408 dev_req_params->lane_rx); 1409 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_HSSERIES), 1410 dev_req_params->hs_rate); 1411 1412 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXHSADAPTTYPE), 1413 PA_NO_ADAPT); 1414 1415 if (!(hba->quirks & UFSHCD_QUIRK_SKIP_DEF_UNIPRO_TIMEOUT_SETTING)) { 1416 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA0), 1417 DL_FC0ProtectionTimeOutVal_Default); 1418 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA1), 1419 DL_TC0ReplayTimeOutVal_Default); 1420 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA2), 1421 DL_AFC0ReqTimeOutVal_Default); 1422 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA3), 1423 DL_FC1ProtectionTimeOutVal_Default); 1424 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA4), 1425 DL_TC1ReplayTimeOutVal_Default); 1426 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA5), 1427 DL_AFC1ReqTimeOutVal_Default); 1428 1429 ufshcd_dme_set(hba, UIC_ARG_MIB(DME_LocalFC0ProtectionTimeOutVal), 1430 DL_FC0ProtectionTimeOutVal_Default); 1431 ufshcd_dme_set(hba, UIC_ARG_MIB(DME_LocalTC0ReplayTimeOutVal), 1432 DL_TC0ReplayTimeOutVal_Default); 1433 ufshcd_dme_set(hba, UIC_ARG_MIB(DME_LocalAFC0ReqTimeOutVal), 1434 DL_AFC0ReqTimeOutVal_Default); 1435 } 1436 1437 ret = ufshcd_uic_change_pwr_mode(hba, 1438 FASTAUTO_MODE << 4 | FASTAUTO_MODE); 1439 1440 if (ret) { 1441 dev_err(hba->dev, "%s: HSG1B FASTAUTO failed ret=%d\n", 1442 __func__, ret); 1443 } 1444 } 1445 1446 /* if already configured to the requested pwr_mode, skip adapt */ 1447 if (dev_req_params->gear_rx == hba->pwr_info.gear_rx && 1448 dev_req_params->gear_tx == hba->pwr_info.gear_tx && 1449 dev_req_params->lane_rx == hba->pwr_info.lane_rx && 1450 dev_req_params->lane_tx == hba->pwr_info.lane_tx && 1451 dev_req_params->pwr_rx == hba->pwr_info.pwr_rx && 1452 dev_req_params->pwr_tx == hba->pwr_info.pwr_tx && 1453 dev_req_params->hs_rate == hba->pwr_info.hs_rate) { 1454 return ret; 1455 } 1456 1457 if (dev_req_params->pwr_rx == FAST_MODE || 1458 dev_req_params->pwr_rx == FASTAUTO_MODE) { 1459 if (host->hw_ver.major >= 3) { 1460 ret = ufshcd_dme_configure_adapt(hba, 1461 dev_req_params->gear_tx, 1462 PA_INITIAL_ADAPT); 1463 } else { 1464 ret = ufshcd_dme_configure_adapt(hba, 1465 dev_req_params->gear_tx, 1466 PA_NO_ADAPT); 1467 } 1468 } else { 1469 ret = ufshcd_dme_configure_adapt(hba, 1470 dev_req_params->gear_tx, 1471 PA_NO_ADAPT); 1472 } 1473 1474 return ret; 1475} 1476 1477static int ufs_mtk_auto_hibern8_disable(struct ufs_hba *hba) 1478{ 1479 int ret; 1480 1481 /* disable auto-hibern8 */ 1482 ufshcd_writel(hba, 0, REG_AUTO_HIBERNATE_IDLE_TIMER); 1483 1484 /* wait host return to idle state when auto-hibern8 off */ 1485 ret = ufs_mtk_wait_idle_state(hba, 5); 1486 if (ret) 1487 goto out; 1488 1489 ret = ufs_mtk_wait_link_state(hba, VS_LINK_UP, 100); 1490 1491out: 1492 if (ret) { 1493 dev_warn(hba->dev, "exit h8 state fail, ret=%d\n", ret); 1494 1495 ufshcd_force_error_recovery(hba); 1496 1497 /* trigger error handler and break suspend */ 1498 ret = -EBUSY; 1499 } 1500 1501 return ret; 1502} 1503 1504static int ufs_mtk_pwr_change_notify(struct ufs_hba *hba, 1505 enum ufs_notify_change_status stage, 1506 const struct ufs_pa_layer_attr *dev_max_params, 1507 struct ufs_pa_layer_attr *dev_req_params) 1508{ 1509 int ret = 0; 1510 static u32 reg; 1511 1512 switch (stage) { 1513 case PRE_CHANGE: 1514 if (ufshcd_is_auto_hibern8_supported(hba)) { 1515 reg = ufshcd_readl(hba, REG_AUTO_HIBERNATE_IDLE_TIMER); 1516 ufs_mtk_auto_hibern8_disable(hba); 1517 } 1518 ret = ufs_mtk_pre_pwr_change(hba, dev_max_params, 1519 dev_req_params); 1520 break; 1521 case POST_CHANGE: 1522 if (ufshcd_is_auto_hibern8_supported(hba)) 1523 ufshcd_writel(hba, reg, REG_AUTO_HIBERNATE_IDLE_TIMER); 1524 break; 1525 default: 1526 ret = -EINVAL; 1527 break; 1528 } 1529 1530 return ret; 1531} 1532 1533static int ufs_mtk_unipro_set_lpm(struct ufs_hba *hba, bool lpm) 1534{ 1535 int ret; 1536 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 1537 1538 ret = ufshcd_dme_set(hba, 1539 UIC_ARG_MIB_SEL(VS_UNIPROPOWERDOWNCONTROL, 0), 1540 lpm ? 1 : 0); 1541 if (!ret || !lpm) { 1542 /* 1543 * Forcibly set as non-LPM mode if UIC commands is failed 1544 * to use default hba_enable_delay_us value for re-enabling 1545 * the host. 1546 */ 1547 host->unipro_lpm = lpm; 1548 } 1549 1550 return ret; 1551} 1552 1553static int ufs_mtk_pre_link(struct ufs_hba *hba) 1554{ 1555 int ret; 1556 u32 tmp; 1557 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 1558 1559 ufs_mtk_get_controller_version(hba); 1560 1561 ret = ufs_mtk_unipro_set_lpm(hba, false); 1562 if (ret) 1563 return ret; 1564 1565 /* 1566 * Setting PA_Local_TX_LCC_Enable to 0 before link startup 1567 * to make sure that both host and device TX LCC are disabled 1568 * once link startup is completed. 1569 */ 1570 ret = ufshcd_disable_host_tx_lcc(hba); 1571 if (ret) 1572 return ret; 1573 1574 /* disable deep stall */ 1575 ret = ufshcd_dme_get(hba, UIC_ARG_MIB(VS_SAVEPOWERCONTROL), &tmp); 1576 if (ret) 1577 return ret; 1578 1579 tmp &= ~(1 << 6); 1580 1581 ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_SAVEPOWERCONTROL), tmp); 1582 1583 /* Enable the 1144 functions setting */ 1584 if (host->ip_ver == IP_VER_MT6989) { 1585 ret = ufshcd_dme_get(hba, UIC_ARG_MIB(VS_DEBUGOMC), &tmp); 1586 if (ret) 1587 return ret; 1588 1589 tmp |= 0x10; 1590 ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_DEBUGOMC), tmp); 1591 } 1592 1593 return ret; 1594} 1595 1596static void ufs_mtk_post_link(struct ufs_hba *hba) 1597{ 1598 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 1599 u32 tmp; 1600 1601 /* fix device PA_INIT no adapt */ 1602 if (host->ip_ver >= IP_VER_MT6899) { 1603 ufshcd_dme_get(hba, UIC_ARG_MIB(VS_DEBUGOMC), &tmp); 1604 tmp |= 0x100; 1605 ufshcd_dme_set(hba, UIC_ARG_MIB(VS_DEBUGOMC), tmp); 1606 } 1607 1608 /* enable unipro clock gating feature */ 1609 ufs_mtk_cfg_unipro_cg(hba, true); 1610} 1611 1612static int ufs_mtk_link_startup_notify(struct ufs_hba *hba, 1613 enum ufs_notify_change_status stage) 1614{ 1615 int ret = 0; 1616 1617 switch (stage) { 1618 case PRE_CHANGE: 1619 ret = ufs_mtk_pre_link(hba); 1620 break; 1621 case POST_CHANGE: 1622 ufs_mtk_post_link(hba); 1623 break; 1624 default: 1625 ret = -EINVAL; 1626 break; 1627 } 1628 1629 return ret; 1630} 1631 1632static int ufs_mtk_device_reset(struct ufs_hba *hba) 1633{ 1634 struct arm_smccc_res res; 1635 1636 ufs_mtk_device_reset_ctrl(0, res); 1637 1638 /* disable hba in middle of device reset */ 1639 ufshcd_hba_stop(hba); 1640 1641 /* 1642 * The reset signal is active low. UFS devices shall detect 1643 * more than or equal to 1us of positive or negative RST_n 1644 * pulse width. 1645 * 1646 * To be on safe side, keep the reset low for at least 10us. 1647 */ 1648 usleep_range(10, 15); 1649 1650 ufs_mtk_device_reset_ctrl(1, res); 1651 1652 /* Some devices may need time to respond to rst_n */ 1653 usleep_range(10000, 15000); 1654 1655 dev_info(hba->dev, "device reset done\n"); 1656 1657 return 0; 1658} 1659 1660static int ufs_mtk_link_set_hpm(struct ufs_hba *hba) 1661{ 1662 int err; 1663 u32 val; 1664 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 1665 1666 err = ufshcd_hba_enable(hba); 1667 if (err) 1668 return err; 1669 1670 err = ufs_mtk_unipro_set_lpm(hba, false); 1671 if (err) { 1672 if (host->ip_ver < IP_VER_MT6899) { 1673 ufs_mtk_dbg_sel(hba); 1674 val = ufshcd_readl(hba, REG_UFS_PROBE); 1675 } else { 1676 val = ufshcd_readl(hba, REG_UFS_UFS_MMIO_OTSD_CTRL); 1677 } 1678 ufshcd_update_evt_hist(hba, UFS_EVT_RESUME_ERR, (u32)val); 1679 val = ufshcd_readl(hba, REG_INTERRUPT_STATUS); 1680 ufshcd_update_evt_hist(hba, UFS_EVT_RESUME_ERR, (u32)val); 1681 return err; 1682 } 1683 1684 err = ufshcd_uic_hibern8_exit(hba); 1685 if (err) 1686 return err; 1687 1688 /* Check link state to make sure exit h8 success */ 1689 err = ufs_mtk_wait_idle_state(hba, 5); 1690 if (err) { 1691 dev_warn(hba->dev, "wait idle fail, err=%d\n", err); 1692 return err; 1693 } 1694 err = ufs_mtk_wait_link_state(hba, VS_LINK_UP, 100); 1695 if (err) { 1696 dev_warn(hba->dev, "exit h8 state fail, err=%d\n", err); 1697 return err; 1698 } 1699 ufshcd_set_link_active(hba); 1700 1701 err = ufshcd_make_hba_operational(hba); 1702 if (err) 1703 return err; 1704 1705 if (hba->mcq_enabled) { 1706 ufs_mtk_config_mcq(hba, false); 1707 ufshcd_mcq_make_queues_operational(hba); 1708 ufshcd_mcq_config_mac(hba, hba->nutrs); 1709 ufshcd_mcq_enable(hba); 1710 } 1711 1712 return 0; 1713} 1714 1715static int ufs_mtk_link_set_lpm(struct ufs_hba *hba) 1716{ 1717 int err; 1718 1719 /* Disable reset confirm feature by UniPro */ 1720 ufshcd_writel(hba, 1721 (ufshcd_readl(hba, REG_UFS_XOUFS_CTRL) & ~0x100), 1722 REG_UFS_XOUFS_CTRL); 1723 1724 err = ufs_mtk_unipro_set_lpm(hba, true); 1725 if (err) { 1726 /* Resume UniPro state for following error recovery */ 1727 ufs_mtk_unipro_set_lpm(hba, false); 1728 return err; 1729 } 1730 1731 return 0; 1732} 1733 1734static void ufs_mtk_vccqx_set_lpm(struct ufs_hba *hba, bool lpm) 1735{ 1736 struct ufs_vreg *vccqx = NULL; 1737 1738 if (!hba->vreg_info.vccq && !hba->vreg_info.vccq2) 1739 return; 1740 1741 if (hba->vreg_info.vccq) 1742 vccqx = hba->vreg_info.vccq; 1743 else 1744 vccqx = hba->vreg_info.vccq2; 1745 1746 regulator_set_mode(vccqx->reg, 1747 lpm ? REGULATOR_MODE_IDLE : REGULATOR_MODE_NORMAL); 1748} 1749 1750static void ufs_mtk_vsx_set_lpm(struct ufs_hba *hba, bool lpm) 1751{ 1752 struct arm_smccc_res res; 1753 1754 ufs_mtk_device_pwr_ctrl(!lpm, 1755 (unsigned long)hba->dev_info.wspecversion, 1756 res); 1757} 1758 1759static void ufs_mtk_dev_vreg_set_lpm(struct ufs_hba *hba, bool lpm) 1760{ 1761 bool skip_vccqx = false; 1762 1763 /* Prevent entering LPM when device is still active */ 1764 if (lpm && ufshcd_is_ufs_dev_active(hba)) 1765 return; 1766 1767 /* Skip vccqx lpm control and control vsx only */ 1768 if (!hba->vreg_info.vccq && !hba->vreg_info.vccq2) 1769 skip_vccqx = true; 1770 1771 /* VCC is always-on, control vsx only */ 1772 if (!hba->vreg_info.vcc) 1773 skip_vccqx = true; 1774 1775 /* Broken vcc keep vcc always on, most case control vsx only */ 1776 if (lpm && hba->vreg_info.vcc && hba->vreg_info.vcc->enabled) { 1777 /* Some device vccqx/vsx can enter lpm */ 1778 if (ufs_mtk_is_allow_vccqx_lpm(hba)) 1779 skip_vccqx = false; 1780 else /* control vsx only */ 1781 skip_vccqx = true; 1782 } 1783 1784 if (lpm) { 1785 if (!skip_vccqx) 1786 ufs_mtk_vccqx_set_lpm(hba, lpm); 1787 ufs_mtk_vsx_set_lpm(hba, lpm); 1788 } else { 1789 ufs_mtk_vsx_set_lpm(hba, lpm); 1790 if (!skip_vccqx) 1791 ufs_mtk_vccqx_set_lpm(hba, lpm); 1792 } 1793} 1794 1795static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op, 1796 enum ufs_notify_change_status status) 1797{ 1798 int err; 1799 struct arm_smccc_res res; 1800 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 1801 1802 if (status == PRE_CHANGE) { 1803 if (ufshcd_is_auto_hibern8_supported(hba)) 1804 return ufs_mtk_auto_hibern8_disable(hba); 1805 return 0; 1806 } 1807 1808 if (ufshcd_is_link_hibern8(hba)) { 1809 err = ufs_mtk_link_set_lpm(hba); 1810 if (err) 1811 goto fail; 1812 } 1813 1814 if (!ufshcd_is_link_active(hba)) { 1815 /* 1816 * Make sure no error will be returned to prevent 1817 * ufshcd_suspend() re-enabling regulators while vreg is still 1818 * in low-power mode. 1819 */ 1820 err = ufs_mtk_mphy_power_on(hba, false); 1821 if (err) 1822 goto fail; 1823 } 1824 1825 if (ufshcd_is_link_off(hba)) 1826 ufs_mtk_device_reset_ctrl(0, res); 1827 1828 ufs_mtk_sram_pwr_ctrl(false, res); 1829 1830 /* Release pm_qos/clk if in scale-up mode during suspend */ 1831 if (ufshcd_is_clkscaling_supported(hba) && (host->clk_scale_up)) { 1832 ufshcd_pm_qos_update(hba, false); 1833 _ufs_mtk_clk_scale(hba, false); 1834 } else if ((!ufshcd_is_clkscaling_supported(hba) && 1835 hba->pwr_info.gear_rx >= UFS_HS_G5)) { 1836 _ufs_mtk_clk_scale(hba, false); 1837 } 1838 1839 return 0; 1840fail: 1841 /* 1842 * Set link as off state enforcedly to trigger 1843 * ufshcd_host_reset_and_restore() in ufshcd_suspend() 1844 * for completed host reset. 1845 */ 1846 ufshcd_set_link_off(hba); 1847 return -EAGAIN; 1848} 1849 1850static int ufs_mtk_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) 1851{ 1852 int err; 1853 struct arm_smccc_res res; 1854 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 1855 1856 if (hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL) 1857 ufs_mtk_dev_vreg_set_lpm(hba, false); 1858 1859 ufs_mtk_sram_pwr_ctrl(true, res); 1860 1861 err = ufs_mtk_mphy_power_on(hba, true); 1862 if (err) 1863 goto fail; 1864 1865 /* Request pm_qos/clk if in scale-up mode after resume */ 1866 if (ufshcd_is_clkscaling_supported(hba) && (host->clk_scale_up)) { 1867 ufshcd_pm_qos_update(hba, true); 1868 _ufs_mtk_clk_scale(hba, true); 1869 } else if ((!ufshcd_is_clkscaling_supported(hba) && 1870 hba->pwr_info.gear_rx >= UFS_HS_G5)) { 1871 _ufs_mtk_clk_scale(hba, true); 1872 } 1873 1874 if (ufshcd_is_link_hibern8(hba)) { 1875 err = ufs_mtk_link_set_hpm(hba); 1876 if (err) 1877 goto fail; 1878 } 1879 1880 return 0; 1881 1882fail: 1883 /* 1884 * Check if the platform (parent) device has resumed, and ensure that 1885 * power, clock, and MTCMOS are all turned on. 1886 */ 1887 err = ufshcd_link_recovery(hba); 1888 if (err) { 1889 dev_err(hba->dev, "Device PM: req=%d, status:%d, err:%d\n", 1890 hba->dev->power.request, 1891 hba->dev->power.runtime_status, 1892 hba->dev->power.runtime_error); 1893 } 1894 1895 return 0; /* Cannot return a failure, otherwise, the I/O will hang. */ 1896} 1897 1898static void ufs_mtk_dbg_register_dump(struct ufs_hba *hba) 1899{ 1900 /* Dump ufshci register 0x140 ~ 0x14C */ 1901 ufshcd_dump_regs(hba, REG_UFS_XOUFS_CTRL, 0x10, 1902 "XOUFS Ctrl (0x140): "); 1903 1904 ufshcd_dump_regs(hba, REG_UFS_EXTREG, 0x4, "Ext Reg "); 1905 1906 /* Dump ufshci register 0x2200 ~ 0x22AC */ 1907 ufshcd_dump_regs(hba, REG_UFS_MPHYCTRL, 1908 REG_UFS_REJECT_MON - REG_UFS_MPHYCTRL + 4, 1909 "MPHY Ctrl (0x2200): "); 1910 1911 /* Direct debugging information to REG_MTK_PROBE */ 1912 ufs_mtk_dbg_sel(hba); 1913 ufshcd_dump_regs(hba, REG_UFS_PROBE, 0x4, "Debug Probe "); 1914} 1915 1916static int ufs_mtk_apply_dev_quirks(struct ufs_hba *hba) 1917{ 1918 struct ufs_dev_info *dev_info = &hba->dev_info; 1919 u16 mid = dev_info->wmanufacturerid; 1920 unsigned int cpu; 1921 1922 if (hba->mcq_enabled) { 1923 /* Iterate all cpus to set affinity for mcq irqs */ 1924 for (cpu = 0; cpu < nr_cpu_ids; cpu++) 1925 ufs_mtk_mcq_set_irq_affinity(hba, cpu); 1926 } 1927 1928 if (mid == UFS_VENDOR_SAMSUNG) { 1929 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TACTIVATE), 6); 1930 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_HIBERN8TIME), 10); 1931 } else if (mid == UFS_VENDOR_MICRON) { 1932 /* Only for the host which have TX skew issue */ 1933 if (ufs_mtk_is_tx_skew_fix(hba) && 1934 (STR_PRFX_EQUAL("MT128GBCAV2U31", dev_info->model) || 1935 STR_PRFX_EQUAL("MT256GBCAV4U31", dev_info->model) || 1936 STR_PRFX_EQUAL("MT512GBCAV8U31", dev_info->model) || 1937 STR_PRFX_EQUAL("MT256GBEAX4U40", dev_info->model) || 1938 STR_PRFX_EQUAL("MT512GAYAX4U40", dev_info->model) || 1939 STR_PRFX_EQUAL("MT001TAYAX8U40", dev_info->model))) { 1940 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TACTIVATE), 8); 1941 } 1942 } 1943 1944 /* 1945 * Decide waiting time before gating reference clock and 1946 * after ungating reference clock according to vendors' 1947 * requirements. 1948 */ 1949 if (mid == UFS_VENDOR_SAMSUNG) 1950 ufs_mtk_setup_ref_clk_wait_us(hba, 1); 1951 else if (mid == UFS_VENDOR_SKHYNIX) 1952 ufs_mtk_setup_ref_clk_wait_us(hba, 30); 1953 else if (mid == UFS_VENDOR_TOSHIBA) 1954 ufs_mtk_setup_ref_clk_wait_us(hba, 100); 1955 else 1956 ufs_mtk_setup_ref_clk_wait_us(hba, 1957 REFCLK_DEFAULT_WAIT_US); 1958 return 0; 1959} 1960 1961static void ufs_mtk_fixup_dev_quirks(struct ufs_hba *hba) 1962{ 1963 ufshcd_fixup_dev_quirks(hba, ufs_mtk_dev_fixups); 1964 1965 if (ufs_mtk_is_broken_vcc(hba) && hba->vreg_info.vcc) { 1966 hba->vreg_info.vcc->always_on = true; 1967 /* 1968 * VCC will be kept always-on thus we don't 1969 * need any delay before putting device's VCC in LPM mode. 1970 */ 1971 hba->dev_quirks &= ~UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM; 1972 } 1973 1974 ufs_mtk_vreg_fix_vcc(hba); 1975 ufs_mtk_vreg_fix_vccqx(hba); 1976 ufs_mtk_fix_ahit(hba); 1977 ufs_mtk_fix_clock_scaling(hba); 1978} 1979 1980static void ufs_mtk_event_notify(struct ufs_hba *hba, 1981 enum ufs_event_type evt, void *data) 1982{ 1983 unsigned int val = *(u32 *)data; 1984 unsigned long reg; 1985 u8 bit; 1986 1987 trace_ufs_mtk_event(evt, val); 1988 1989 /* Print details of UIC Errors */ 1990 if (evt <= UFS_EVT_DME_ERR) { 1991 dev_info(hba->dev, 1992 "Host UIC Error Code (%s): %08x\n", 1993 ufs_uic_err_str[evt], val); 1994 reg = val; 1995 } 1996 1997 if (evt == UFS_EVT_PA_ERR) { 1998 for_each_set_bit(bit, &reg, ARRAY_SIZE(ufs_uic_pa_err_str)) 1999 dev_info(hba->dev, "%s\n", ufs_uic_pa_err_str[bit]); 2000 } 2001 2002 if (evt == UFS_EVT_DL_ERR) { 2003 for_each_set_bit(bit, &reg, ARRAY_SIZE(ufs_uic_dl_err_str)) 2004 dev_info(hba->dev, "%s\n", ufs_uic_dl_err_str[bit]); 2005 } 2006} 2007 2008static void ufs_mtk_config_scaling_param(struct ufs_hba *hba, 2009 struct devfreq_dev_profile *profile, 2010 struct devfreq_simple_ondemand_data *data) 2011{ 2012 /* Customize min gear in clk scaling */ 2013 hba->clk_scaling.min_gear = UFS_HS_G4; 2014 2015 hba->vps->devfreq_profile.polling_ms = 200; 2016 hba->vps->ondemand_data.upthreshold = 50; 2017 hba->vps->ondemand_data.downdifferential = 20; 2018} 2019 2020static void _ufs_mtk_clk_scale(struct ufs_hba *hba, bool scale_up) 2021{ 2022 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 2023 struct ufs_mtk_clk *mclk = &host->mclk; 2024 struct ufs_clk_info *clki = mclk->ufs_sel_clki; 2025 struct ufs_clk_info *fde_clki = mclk->ufs_fde_clki; 2026 struct regulator *reg; 2027 int volt, ret = 0; 2028 bool clk_bind_vcore = false; 2029 bool clk_fde_scale = false; 2030 2031 if (!hba->clk_scaling.is_initialized) 2032 return; 2033 2034 if (!clki || !fde_clki) 2035 return; 2036 2037 reg = host->mclk.reg_vcore; 2038 volt = host->mclk.vcore_volt; 2039 if (reg && volt != 0) 2040 clk_bind_vcore = true; 2041 2042 if (mclk->ufs_fde_max_clki && mclk->ufs_fde_min_clki) 2043 clk_fde_scale = true; 2044 2045 ret = clk_prepare_enable(clki->clk); 2046 if (ret) { 2047 dev_info(hba->dev, 2048 "clk_prepare_enable() fail, ret: %d\n", ret); 2049 return; 2050 } 2051 2052 if (clk_fde_scale) { 2053 ret = clk_prepare_enable(fde_clki->clk); 2054 if (ret) { 2055 dev_info(hba->dev, 2056 "fde clk_prepare_enable() fail, ret: %d\n", ret); 2057 return; 2058 } 2059 } 2060 2061 if (scale_up) { 2062 if (clk_bind_vcore) { 2063 ret = regulator_set_voltage(reg, volt, INT_MAX); 2064 if (ret) { 2065 dev_info(hba->dev, 2066 "Failed to set vcore to %d\n", volt); 2067 goto out; 2068 } 2069 } 2070 2071 ret = clk_set_parent(clki->clk, mclk->ufs_sel_max_clki->clk); 2072 if (ret) { 2073 dev_info(hba->dev, "Failed to set clk mux, ret = %d\n", 2074 ret); 2075 } 2076 2077 if (clk_fde_scale) { 2078 ret = clk_set_parent(fde_clki->clk, 2079 mclk->ufs_fde_max_clki->clk); 2080 if (ret) { 2081 dev_info(hba->dev, 2082 "Failed to set fde clk mux, ret = %d\n", 2083 ret); 2084 } 2085 } 2086 } else { 2087 if (clk_fde_scale) { 2088 ret = clk_set_parent(fde_clki->clk, 2089 mclk->ufs_fde_min_clki->clk); 2090 if (ret) { 2091 dev_info(hba->dev, 2092 "Failed to set fde clk mux, ret = %d\n", 2093 ret); 2094 goto out; 2095 } 2096 } 2097 2098 ret = clk_set_parent(clki->clk, mclk->ufs_sel_min_clki->clk); 2099 if (ret) { 2100 dev_info(hba->dev, "Failed to set clk mux, ret = %d\n", 2101 ret); 2102 goto out; 2103 } 2104 2105 if (clk_bind_vcore) { 2106 ret = regulator_set_voltage(reg, 0, INT_MAX); 2107 if (ret) { 2108 dev_info(hba->dev, 2109 "failed to set vcore to MIN\n"); 2110 } 2111 } 2112 } 2113 2114out: 2115 clk_disable_unprepare(clki->clk); 2116 2117 if (clk_fde_scale) 2118 clk_disable_unprepare(fde_clki->clk); 2119} 2120 2121/** 2122 * ufs_mtk_clk_scale - Internal clk scaling operation 2123 * 2124 * MTK platform supports clk scaling by switching parent of ufs_sel(mux). 2125 * The ufs_sel downstream to ufs_ck which feeds directly to UFS hardware. 2126 * Max and min clocks rate of ufs_sel defined in dts should match rate of 2127 * "ufs_sel_max_src" and "ufs_sel_min_src" respectively. 2128 * This prevent changing rate of pll clock that is shared between modules. 2129 * 2130 * @hba: per adapter instance 2131 * @scale_up: True for scaling up and false for scaling down 2132 */ 2133static void ufs_mtk_clk_scale(struct ufs_hba *hba, bool scale_up) 2134{ 2135 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 2136 struct ufs_mtk_clk *mclk = &host->mclk; 2137 struct ufs_clk_info *clki = mclk->ufs_sel_clki; 2138 2139 if (host->clk_scale_up == scale_up) 2140 goto out; 2141 2142 if (scale_up) 2143 _ufs_mtk_clk_scale(hba, true); 2144 else 2145 _ufs_mtk_clk_scale(hba, false); 2146 2147 host->clk_scale_up = scale_up; 2148 2149 /* Must always set before clk_set_rate() */ 2150 if (scale_up) 2151 clki->curr_freq = clki->max_freq; 2152 else 2153 clki->curr_freq = clki->min_freq; 2154out: 2155 trace_ufs_mtk_clk_scale(clki->name, scale_up, clk_get_rate(clki->clk)); 2156} 2157 2158static int ufs_mtk_clk_scale_notify(struct ufs_hba *hba, bool scale_up, 2159 unsigned long target_freq, 2160 enum ufs_notify_change_status status) 2161{ 2162 if (!ufshcd_is_clkscaling_supported(hba)) 2163 return 0; 2164 2165 if (status == PRE_CHANGE) { 2166 /* Switch parent before clk_set_rate() */ 2167 ufs_mtk_clk_scale(hba, scale_up); 2168 } else { 2169 /* Request interrupt latency QoS accordingly */ 2170 ufs_mtk_scale_perf(hba, scale_up); 2171 } 2172 2173 return 0; 2174} 2175 2176static int ufs_mtk_get_hba_mac(struct ufs_hba *hba) 2177{ 2178 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 2179 2180 /* MCQ operation not permitted */ 2181 if (host->caps & UFS_MTK_CAP_DISABLE_MCQ) 2182 return -EPERM; 2183 2184 return MAX_SUPP_MAC; 2185} 2186 2187static int ufs_mtk_op_runtime_config(struct ufs_hba *hba) 2188{ 2189 struct ufshcd_mcq_opr_info_t *opr; 2190 int i; 2191 2192 hba->mcq_opr[OPR_SQD].offset = REG_UFS_MTK_SQD; 2193 hba->mcq_opr[OPR_SQIS].offset = REG_UFS_MTK_SQIS; 2194 hba->mcq_opr[OPR_CQD].offset = REG_UFS_MTK_CQD; 2195 hba->mcq_opr[OPR_CQIS].offset = REG_UFS_MTK_CQIS; 2196 2197 for (i = 0; i < OPR_MAX; i++) { 2198 opr = &hba->mcq_opr[i]; 2199 opr->stride = REG_UFS_MCQ_STRIDE; 2200 opr->base = hba->mmio_base + opr->offset; 2201 } 2202 2203 return 0; 2204} 2205 2206static int ufs_mtk_mcq_config_resource(struct ufs_hba *hba) 2207{ 2208 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 2209 2210 /* fail mcq initialization if interrupt is not filled properly */ 2211 if (!host->mcq_nr_intr) { 2212 dev_info(hba->dev, "IRQs not ready. MCQ disabled."); 2213 return -EINVAL; 2214 } 2215 2216 hba->mcq_base = hba->mmio_base + MCQ_QUEUE_OFFSET(hba->mcq_capabilities); 2217 return 0; 2218} 2219 2220static irqreturn_t ufs_mtk_mcq_intr(int irq, void *__intr_info) 2221{ 2222 struct ufs_mtk_mcq_intr_info *mcq_intr_info = __intr_info; 2223 struct ufs_hba *hba = mcq_intr_info->hba; 2224 struct ufs_hw_queue *hwq; 2225 u32 events; 2226 int qid = mcq_intr_info->qid; 2227 2228 hwq = &hba->uhq[qid]; 2229 2230 events = ufshcd_mcq_read_cqis(hba, qid); 2231 if (events) 2232 ufshcd_mcq_write_cqis(hba, events, qid); 2233 2234 if (events & UFSHCD_MCQ_CQIS_TAIL_ENT_PUSH_STS) 2235 ufshcd_mcq_poll_cqe_lock(hba, hwq); 2236 2237 return IRQ_HANDLED; 2238} 2239 2240static int ufs_mtk_config_mcq_irq(struct ufs_hba *hba) 2241{ 2242 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 2243 u32 irq, i; 2244 int ret; 2245 2246 for (i = 0; i < host->mcq_nr_intr; i++) { 2247 irq = host->mcq_intr_info[i].irq; 2248 if (irq == MTK_MCQ_INVALID_IRQ) { 2249 dev_err(hba->dev, "invalid irq. %d\n", i); 2250 return -ENOPARAM; 2251 } 2252 2253 host->mcq_intr_info[i].qid = i; 2254 ret = devm_request_irq(hba->dev, irq, ufs_mtk_mcq_intr, 0, UFSHCD, 2255 &host->mcq_intr_info[i]); 2256 2257 dev_dbg(hba->dev, "request irq %d intr %s\n", irq, ret ? "failed" : ""); 2258 2259 if (ret) { 2260 dev_err(hba->dev, "Cannot request irq %d\n", ret); 2261 return ret; 2262 } 2263 } 2264 host->is_mcq_intr_enabled = true; 2265 2266 return 0; 2267} 2268 2269static int ufs_mtk_config_mcq(struct ufs_hba *hba, bool irq) 2270{ 2271 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 2272 int ret = 0; 2273 2274 if (!host->mcq_set_intr) { 2275 /* Disable irq option register */ 2276 ufshcd_rmwl(hba, MCQ_INTR_EN_MSK, 0, REG_UFS_MMIO_OPT_CTRL_0); 2277 2278 if (irq) { 2279 ret = ufs_mtk_config_mcq_irq(hba); 2280 if (ret) 2281 return ret; 2282 } 2283 2284 host->mcq_set_intr = true; 2285 } 2286 2287 ufshcd_rmwl(hba, MCQ_AH8, MCQ_AH8, REG_UFS_MMIO_OPT_CTRL_0); 2288 ufshcd_rmwl(hba, MCQ_INTR_EN_MSK, MCQ_MULTI_INTR_EN, REG_UFS_MMIO_OPT_CTRL_0); 2289 2290 return 0; 2291} 2292 2293static int ufs_mtk_config_esi(struct ufs_hba *hba) 2294{ 2295 return ufs_mtk_config_mcq(hba, true); 2296} 2297 2298static void ufs_mtk_config_scsi_dev(struct scsi_device *sdev) 2299{ 2300 struct ufs_hba *hba = shost_priv(sdev->host); 2301 2302 dev_dbg(hba->dev, "lu %llu scsi device configured", sdev->lun); 2303 if (sdev->lun == 2) 2304 blk_queue_flag_set(QUEUE_FLAG_SAME_FORCE, sdev->request_queue); 2305} 2306 2307/* 2308 * struct ufs_hba_mtk_vops - UFS MTK specific variant operations 2309 * 2310 * The variant operations configure the necessary controller and PHY 2311 * handshake during initialization. 2312 */ 2313static const struct ufs_hba_variant_ops ufs_hba_mtk_vops = { 2314 .name = "mediatek.ufshci", 2315 .max_num_rtt = MTK_MAX_NUM_RTT, 2316 .init = ufs_mtk_init, 2317 .get_ufs_hci_version = ufs_mtk_get_ufs_hci_version, 2318 .setup_clocks = ufs_mtk_setup_clocks, 2319 .hce_enable_notify = ufs_mtk_hce_enable_notify, 2320 .link_startup_notify = ufs_mtk_link_startup_notify, 2321 .pwr_change_notify = ufs_mtk_pwr_change_notify, 2322 .apply_dev_quirks = ufs_mtk_apply_dev_quirks, 2323 .fixup_dev_quirks = ufs_mtk_fixup_dev_quirks, 2324 .suspend = ufs_mtk_suspend, 2325 .resume = ufs_mtk_resume, 2326 .dbg_register_dump = ufs_mtk_dbg_register_dump, 2327 .device_reset = ufs_mtk_device_reset, 2328 .event_notify = ufs_mtk_event_notify, 2329 .config_scaling_param = ufs_mtk_config_scaling_param, 2330 .clk_scale_notify = ufs_mtk_clk_scale_notify, 2331 /* mcq vops */ 2332 .get_hba_mac = ufs_mtk_get_hba_mac, 2333 .op_runtime_config = ufs_mtk_op_runtime_config, 2334 .mcq_config_resource = ufs_mtk_mcq_config_resource, 2335 .config_esi = ufs_mtk_config_esi, 2336 .config_scsi_dev = ufs_mtk_config_scsi_dev, 2337}; 2338 2339/** 2340 * ufs_mtk_probe - probe routine of the driver 2341 * @pdev: pointer to Platform device handle 2342 * 2343 * Return: zero for success and non-zero for failure. 2344 */ 2345static int ufs_mtk_probe(struct platform_device *pdev) 2346{ 2347 int err; 2348 struct device *dev = &pdev->dev, *phy_dev = NULL; 2349 struct device_node *reset_node, *phy_node = NULL; 2350 struct platform_device *reset_pdev, *phy_pdev = NULL; 2351 struct device_link *link; 2352 struct ufs_hba *hba; 2353 struct ufs_mtk_host *host; 2354 2355 reset_node = of_find_compatible_node(NULL, NULL, 2356 "ti,syscon-reset"); 2357 if (!reset_node) { 2358 dev_notice(dev, "find ti,syscon-reset fail\n"); 2359 goto skip_reset; 2360 } 2361 reset_pdev = of_find_device_by_node(reset_node); 2362 if (!reset_pdev) { 2363 dev_notice(dev, "find reset_pdev fail\n"); 2364 goto skip_reset; 2365 } 2366 link = device_link_add(dev, &reset_pdev->dev, 2367 DL_FLAG_AUTOPROBE_CONSUMER); 2368 put_device(&reset_pdev->dev); 2369 if (!link) { 2370 dev_notice(dev, "add reset device_link fail\n"); 2371 goto skip_reset; 2372 } 2373 /* supplier is not probed */ 2374 if (link->status == DL_STATE_DORMANT) { 2375 err = -EPROBE_DEFER; 2376 goto out; 2377 } 2378 2379skip_reset: 2380 /* find phy node */ 2381 phy_node = of_parse_phandle(dev->of_node, "phys", 0); 2382 2383 if (phy_node) { 2384 phy_pdev = of_find_device_by_node(phy_node); 2385 if (!phy_pdev) 2386 goto skip_phy; 2387 phy_dev = &phy_pdev->dev; 2388 2389 pm_runtime_set_active(phy_dev); 2390 pm_runtime_enable(phy_dev); 2391 pm_runtime_get_sync(phy_dev); 2392 2393 put_device(phy_dev); 2394 dev_info(dev, "phys node found\n"); 2395 } else { 2396 dev_notice(dev, "phys node not found\n"); 2397 } 2398 2399skip_phy: 2400 /* perform generic probe */ 2401 err = ufshcd_pltfrm_init(pdev, &ufs_hba_mtk_vops); 2402 if (err) { 2403 dev_err(dev, "probe failed %d\n", err); 2404 goto out; 2405 } 2406 2407 hba = platform_get_drvdata(pdev); 2408 if (!hba) 2409 goto out; 2410 2411 if (phy_node && phy_dev) { 2412 host = ufshcd_get_variant(hba); 2413 host->phy_dev = phy_dev; 2414 } 2415 2416 /* 2417 * Because the default power setting of VSx (the upper layer of 2418 * VCCQ/VCCQ2) is HWLP, we need to prevent VCCQ/VCCQ2 from 2419 * entering LPM. 2420 */ 2421 ufs_mtk_dev_vreg_set_lpm(hba, false); 2422 2423out: 2424 of_node_put(phy_node); 2425 of_node_put(reset_node); 2426 return err; 2427} 2428 2429/** 2430 * ufs_mtk_remove - set driver_data of the device to NULL 2431 * @pdev: pointer to platform device handle 2432 * 2433 * Always return 0 2434 */ 2435static void ufs_mtk_remove(struct platform_device *pdev) 2436{ 2437 ufshcd_pltfrm_remove(pdev); 2438} 2439 2440#ifdef CONFIG_PM_SLEEP 2441static int ufs_mtk_system_suspend(struct device *dev) 2442{ 2443 struct ufs_hba *hba = dev_get_drvdata(dev); 2444 struct arm_smccc_res res; 2445 int ret; 2446 2447 if (hba->shutting_down) { 2448 ret = -EBUSY; 2449 goto out; 2450 } 2451 2452 ret = ufshcd_system_suspend(dev); 2453 if (ret) 2454 goto out; 2455 2456 if (pm_runtime_suspended(hba->dev)) 2457 goto out; 2458 2459 ufs_mtk_dev_vreg_set_lpm(hba, true); 2460 2461 if (ufs_mtk_is_rtff_mtcmos(hba)) 2462 ufs_mtk_mtcmos_ctrl(false, res); 2463 2464out: 2465 return ret; 2466} 2467 2468static int ufs_mtk_system_resume(struct device *dev) 2469{ 2470 int ret = 0; 2471 struct ufs_hba *hba = dev_get_drvdata(dev); 2472 struct arm_smccc_res res; 2473 2474 if (pm_runtime_suspended(hba->dev)) 2475 goto out; 2476 2477 if (ufs_mtk_is_rtff_mtcmos(hba)) 2478 ufs_mtk_mtcmos_ctrl(true, res); 2479 2480 ufs_mtk_dev_vreg_set_lpm(hba, false); 2481 2482out: 2483 ret = ufshcd_system_resume(dev); 2484 2485 return ret; 2486} 2487#endif 2488 2489#ifdef CONFIG_PM 2490static int ufs_mtk_runtime_suspend(struct device *dev) 2491{ 2492 struct ufs_hba *hba = dev_get_drvdata(dev); 2493 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 2494 struct arm_smccc_res res; 2495 int ret = 0; 2496 2497 ret = ufshcd_runtime_suspend(dev); 2498 if (ret) 2499 return ret; 2500 2501 ufs_mtk_dev_vreg_set_lpm(hba, true); 2502 2503 if (ufs_mtk_is_rtff_mtcmos(hba)) 2504 ufs_mtk_mtcmos_ctrl(false, res); 2505 2506 if (host->phy_dev) 2507 pm_runtime_put_sync(host->phy_dev); 2508 2509 return 0; 2510} 2511 2512static int ufs_mtk_runtime_resume(struct device *dev) 2513{ 2514 struct ufs_hba *hba = dev_get_drvdata(dev); 2515 struct ufs_mtk_host *host = ufshcd_get_variant(hba); 2516 struct arm_smccc_res res; 2517 2518 if (ufs_mtk_is_rtff_mtcmos(hba)) 2519 ufs_mtk_mtcmos_ctrl(true, res); 2520 2521 if (host->phy_dev) 2522 pm_runtime_get_sync(host->phy_dev); 2523 2524 ufs_mtk_dev_vreg_set_lpm(hba, false); 2525 2526 return ufshcd_runtime_resume(dev); 2527} 2528#endif 2529 2530static const struct dev_pm_ops ufs_mtk_pm_ops = { 2531 SET_SYSTEM_SLEEP_PM_OPS(ufs_mtk_system_suspend, 2532 ufs_mtk_system_resume) 2533 SET_RUNTIME_PM_OPS(ufs_mtk_runtime_suspend, 2534 ufs_mtk_runtime_resume, NULL) 2535 .prepare = ufshcd_suspend_prepare, 2536 .complete = ufshcd_resume_complete, 2537}; 2538 2539static struct platform_driver ufs_mtk_pltform = { 2540 .probe = ufs_mtk_probe, 2541 .remove = ufs_mtk_remove, 2542 .driver = { 2543 .name = "ufshcd-mtk", 2544 .pm = &ufs_mtk_pm_ops, 2545 .of_match_table = ufs_mtk_of_match, 2546 }, 2547}; 2548 2549MODULE_AUTHOR("Stanley Chu <stanley.chu@mediatek.com>"); 2550MODULE_AUTHOR("Peter Wang <peter.wang@mediatek.com>"); 2551MODULE_DESCRIPTION("MediaTek UFS Host Driver"); 2552MODULE_LICENSE("GPL v2"); 2553 2554module_platform_driver(ufs_mtk_pltform);