18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Synopsys G210 Test Chip driver 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com) 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Authors: Joao Pinto <jpinto@synopsys.com> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include "ufshcd.h" 118c2ecf20Sopenharmony_ci#include "unipro.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include "ufshcd-dwc.h" 148c2ecf20Sopenharmony_ci#include "ufshci-dwc.h" 158c2ecf20Sopenharmony_ci#include "tc-dwc-g210.h" 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci/** 188c2ecf20Sopenharmony_ci * tc_dwc_g210_setup_40bit_rmmi() 198c2ecf20Sopenharmony_ci * This function configures Synopsys TC specific atributes (40-bit RMMI) 208c2ecf20Sopenharmony_ci * @hba: Pointer to drivers structure 218c2ecf20Sopenharmony_ci * 228c2ecf20Sopenharmony_ci * Returns 0 on success or non-zero value on failure 238c2ecf20Sopenharmony_ci */ 248c2ecf20Sopenharmony_cistatic int tc_dwc_g210_setup_40bit_rmmi(struct ufs_hba *hba) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci static const struct ufshcd_dme_attr_val setup_attrs[] = { 278c2ecf20Sopenharmony_ci { UIC_ARG_MIB(TX_GLOBALHIBERNATE), 0x00, DME_LOCAL }, 288c2ecf20Sopenharmony_ci { UIC_ARG_MIB(REFCLKMODE), 0x01, DME_LOCAL }, 298c2ecf20Sopenharmony_ci { UIC_ARG_MIB(CDIRECTCTRL6), 0x80, DME_LOCAL }, 308c2ecf20Sopenharmony_ci { UIC_ARG_MIB(CBDIVFACTOR), 0x08, DME_LOCAL }, 318c2ecf20Sopenharmony_ci { UIC_ARG_MIB(CBDCOCTRL5), 0x64, DME_LOCAL }, 328c2ecf20Sopenharmony_ci { UIC_ARG_MIB(CBPRGTUNING), 0x09, DME_LOCAL }, 338c2ecf20Sopenharmony_ci { UIC_ARG_MIB(RTOBSERVESELECT), 0x00, DME_LOCAL }, 348c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(TX_REFCLKFREQ, SELIND_LN0_TX), 0x01, 358c2ecf20Sopenharmony_ci DME_LOCAL }, 368c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL, SELIND_LN0_TX), 0x19, 378c2ecf20Sopenharmony_ci DME_LOCAL }, 388c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGEXTRATTR, SELIND_LN0_TX), 0x14, 398c2ecf20Sopenharmony_ci DME_LOCAL }, 408c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(DITHERCTRL2, SELIND_LN0_TX), 0xd6, 418c2ecf20Sopenharmony_ci DME_LOCAL }, 428c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RX_REFCLKFREQ, SELIND_LN0_RX), 0x01, 438c2ecf20Sopenharmony_ci DME_LOCAL }, 448c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL, SELIND_LN0_RX), 0x19, 458c2ecf20Sopenharmony_ci DME_LOCAL }, 468c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGWIDEINLN, SELIND_LN0_RX), 4, 478c2ecf20Sopenharmony_ci DME_LOCAL }, 488c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN0_RX), 0x80, 498c2ecf20Sopenharmony_ci DME_LOCAL }, 508c2ecf20Sopenharmony_ci { UIC_ARG_MIB(DIRECTCTRL10), 0x04, DME_LOCAL }, 518c2ecf20Sopenharmony_ci { UIC_ARG_MIB(DIRECTCTRL19), 0x02, DME_LOCAL }, 528c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN0_RX), 0x80, 538c2ecf20Sopenharmony_ci DME_LOCAL }, 548c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(ENARXDIRECTCFG4, SELIND_LN0_RX), 0x03, 558c2ecf20Sopenharmony_ci DME_LOCAL }, 568c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXOVR8, SELIND_LN0_RX), 0x16, 578c2ecf20Sopenharmony_ci DME_LOCAL }, 588c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RXDIRECTCTRL2, SELIND_LN0_RX), 0x42, 598c2ecf20Sopenharmony_ci DME_LOCAL }, 608c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(ENARXDIRECTCFG3, SELIND_LN0_RX), 0xa4, 618c2ecf20Sopenharmony_ci DME_LOCAL }, 628c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RXCALCTRL, SELIND_LN0_RX), 0x01, 638c2ecf20Sopenharmony_ci DME_LOCAL }, 648c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(ENARXDIRECTCFG2, SELIND_LN0_RX), 0x01, 658c2ecf20Sopenharmony_ci DME_LOCAL }, 668c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXOVR4, SELIND_LN0_RX), 0x28, 678c2ecf20Sopenharmony_ci DME_LOCAL }, 688c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RXSQCTRL, SELIND_LN0_RX), 0x1E, 698c2ecf20Sopenharmony_ci DME_LOCAL }, 708c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN0_RX), 0x2f, 718c2ecf20Sopenharmony_ci DME_LOCAL }, 728c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN0_RX), 0x2f, 738c2ecf20Sopenharmony_ci DME_LOCAL }, 748c2ecf20Sopenharmony_ci { UIC_ARG_MIB(CBPRGPLL2), 0x00, DME_LOCAL }, 758c2ecf20Sopenharmony_ci }; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci return ufshcd_dwc_dme_set_attrs(hba, setup_attrs, 788c2ecf20Sopenharmony_ci ARRAY_SIZE(setup_attrs)); 798c2ecf20Sopenharmony_ci} 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci/** 828c2ecf20Sopenharmony_ci * tc_dwc_g210_setup_20bit_rmmi_lane0() 838c2ecf20Sopenharmony_ci * This function configures Synopsys TC 20-bit RMMI Lane 0 848c2ecf20Sopenharmony_ci * @hba: Pointer to drivers structure 858c2ecf20Sopenharmony_ci * 868c2ecf20Sopenharmony_ci * Returns 0 on success or non-zero value on failure 878c2ecf20Sopenharmony_ci */ 888c2ecf20Sopenharmony_cistatic int tc_dwc_g210_setup_20bit_rmmi_lane0(struct ufs_hba *hba) 898c2ecf20Sopenharmony_ci{ 908c2ecf20Sopenharmony_ci static const struct ufshcd_dme_attr_val setup_attrs[] = { 918c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(TX_REFCLKFREQ, SELIND_LN0_TX), 0x01, 928c2ecf20Sopenharmony_ci DME_LOCAL }, 938c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL, SELIND_LN0_TX), 0x19, 948c2ecf20Sopenharmony_ci DME_LOCAL }, 958c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL, SELIND_LN0_RX), 0x19, 968c2ecf20Sopenharmony_ci DME_LOCAL }, 978c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGEXTRATTR, SELIND_LN0_TX), 0x12, 988c2ecf20Sopenharmony_ci DME_LOCAL }, 998c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(DITHERCTRL2, SELIND_LN0_TX), 0xd6, 1008c2ecf20Sopenharmony_ci DME_LOCAL }, 1018c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RX_REFCLKFREQ, SELIND_LN0_RX), 0x01, 1028c2ecf20Sopenharmony_ci DME_LOCAL }, 1038c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGWIDEINLN, SELIND_LN0_RX), 2, 1048c2ecf20Sopenharmony_ci DME_LOCAL }, 1058c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN0_RX), 0x80, 1068c2ecf20Sopenharmony_ci DME_LOCAL }, 1078c2ecf20Sopenharmony_ci { UIC_ARG_MIB(DIRECTCTRL10), 0x04, DME_LOCAL }, 1088c2ecf20Sopenharmony_ci { UIC_ARG_MIB(DIRECTCTRL19), 0x02, DME_LOCAL }, 1098c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(ENARXDIRECTCFG4, SELIND_LN0_RX), 0x03, 1108c2ecf20Sopenharmony_ci DME_LOCAL }, 1118c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXOVR8, SELIND_LN0_RX), 0x16, 1128c2ecf20Sopenharmony_ci DME_LOCAL }, 1138c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RXDIRECTCTRL2, SELIND_LN0_RX), 0x42, 1148c2ecf20Sopenharmony_ci DME_LOCAL }, 1158c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(ENARXDIRECTCFG3, SELIND_LN0_RX), 0xa4, 1168c2ecf20Sopenharmony_ci DME_LOCAL }, 1178c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RXCALCTRL, SELIND_LN0_RX), 0x01, 1188c2ecf20Sopenharmony_ci DME_LOCAL }, 1198c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(ENARXDIRECTCFG2, SELIND_LN0_RX), 0x01, 1208c2ecf20Sopenharmony_ci DME_LOCAL }, 1218c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXOVR4, SELIND_LN0_RX), 0x28, 1228c2ecf20Sopenharmony_ci DME_LOCAL }, 1238c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RXSQCTRL, SELIND_LN0_RX), 0x1E, 1248c2ecf20Sopenharmony_ci DME_LOCAL }, 1258c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN0_RX), 0x2f, 1268c2ecf20Sopenharmony_ci DME_LOCAL }, 1278c2ecf20Sopenharmony_ci { UIC_ARG_MIB(CBPRGPLL2), 0x00, DME_LOCAL }, 1288c2ecf20Sopenharmony_ci }; 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci return ufshcd_dwc_dme_set_attrs(hba, setup_attrs, 1318c2ecf20Sopenharmony_ci ARRAY_SIZE(setup_attrs)); 1328c2ecf20Sopenharmony_ci} 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci/** 1358c2ecf20Sopenharmony_ci * tc_dwc_g210_setup_20bit_rmmi_lane1() 1368c2ecf20Sopenharmony_ci * This function configures Synopsys TC 20-bit RMMI Lane 1 1378c2ecf20Sopenharmony_ci * @hba: Pointer to drivers structure 1388c2ecf20Sopenharmony_ci * 1398c2ecf20Sopenharmony_ci * Returns 0 on success or non-zero value on failure 1408c2ecf20Sopenharmony_ci */ 1418c2ecf20Sopenharmony_cistatic int tc_dwc_g210_setup_20bit_rmmi_lane1(struct ufs_hba *hba) 1428c2ecf20Sopenharmony_ci{ 1438c2ecf20Sopenharmony_ci int connected_rx_lanes = 0; 1448c2ecf20Sopenharmony_ci int connected_tx_lanes = 0; 1458c2ecf20Sopenharmony_ci int ret = 0; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci static const struct ufshcd_dme_attr_val setup_tx_attrs[] = { 1488c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(TX_REFCLKFREQ, SELIND_LN1_TX), 0x0d, 1498c2ecf20Sopenharmony_ci DME_LOCAL }, 1508c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL, SELIND_LN1_TX), 0x19, 1518c2ecf20Sopenharmony_ci DME_LOCAL }, 1528c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGEXTRATTR, SELIND_LN1_TX), 0x12, 1538c2ecf20Sopenharmony_ci DME_LOCAL }, 1548c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(DITHERCTRL2, SELIND_LN0_TX), 0xd6, 1558c2ecf20Sopenharmony_ci DME_LOCAL }, 1568c2ecf20Sopenharmony_ci }; 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci static const struct ufshcd_dme_attr_val setup_rx_attrs[] = { 1598c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RX_REFCLKFREQ, SELIND_LN1_RX), 0x01, 1608c2ecf20Sopenharmony_ci DME_LOCAL }, 1618c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL, SELIND_LN1_RX), 0x19, 1628c2ecf20Sopenharmony_ci DME_LOCAL }, 1638c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGWIDEINLN, SELIND_LN1_RX), 2, 1648c2ecf20Sopenharmony_ci DME_LOCAL }, 1658c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN1_RX), 0x80, 1668c2ecf20Sopenharmony_ci DME_LOCAL }, 1678c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(ENARXDIRECTCFG4, SELIND_LN1_RX), 0x03, 1688c2ecf20Sopenharmony_ci DME_LOCAL }, 1698c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXOVR8, SELIND_LN1_RX), 0x16, 1708c2ecf20Sopenharmony_ci DME_LOCAL }, 1718c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RXDIRECTCTRL2, SELIND_LN1_RX), 0x42, 1728c2ecf20Sopenharmony_ci DME_LOCAL }, 1738c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(ENARXDIRECTCFG3, SELIND_LN1_RX), 0xa4, 1748c2ecf20Sopenharmony_ci DME_LOCAL }, 1758c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RXCALCTRL, SELIND_LN1_RX), 0x01, 1768c2ecf20Sopenharmony_ci DME_LOCAL }, 1778c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(ENARXDIRECTCFG2, SELIND_LN1_RX), 0x01, 1788c2ecf20Sopenharmony_ci DME_LOCAL }, 1798c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXOVR4, SELIND_LN1_RX), 0x28, 1808c2ecf20Sopenharmony_ci DME_LOCAL }, 1818c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(RXSQCTRL, SELIND_LN1_RX), 0x1E, 1828c2ecf20Sopenharmony_ci DME_LOCAL }, 1838c2ecf20Sopenharmony_ci { UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN1_RX), 0x2f, 1848c2ecf20Sopenharmony_ci DME_LOCAL }, 1858c2ecf20Sopenharmony_ci }; 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci /* Get the available lane count */ 1888c2ecf20Sopenharmony_ci ufshcd_dme_get(hba, UIC_ARG_MIB(PA_AVAILRXDATALANES), 1898c2ecf20Sopenharmony_ci &connected_rx_lanes); 1908c2ecf20Sopenharmony_ci ufshcd_dme_get(hba, UIC_ARG_MIB(PA_AVAILTXDATALANES), 1918c2ecf20Sopenharmony_ci &connected_tx_lanes); 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci if (connected_tx_lanes == 2) { 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci ret = ufshcd_dwc_dme_set_attrs(hba, setup_tx_attrs, 1968c2ecf20Sopenharmony_ci ARRAY_SIZE(setup_tx_attrs)); 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci if (ret) 1998c2ecf20Sopenharmony_ci goto out; 2008c2ecf20Sopenharmony_ci } 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci if (connected_rx_lanes == 2) { 2038c2ecf20Sopenharmony_ci ret = ufshcd_dwc_dme_set_attrs(hba, setup_rx_attrs, 2048c2ecf20Sopenharmony_ci ARRAY_SIZE(setup_rx_attrs)); 2058c2ecf20Sopenharmony_ci } 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ciout: 2088c2ecf20Sopenharmony_ci return ret; 2098c2ecf20Sopenharmony_ci} 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_ci/** 2128c2ecf20Sopenharmony_ci * tc_dwc_g210_setup_20bit_rmmi() 2138c2ecf20Sopenharmony_ci * This function configures Synopsys TC specific atributes (20-bit RMMI) 2148c2ecf20Sopenharmony_ci * @hba: Pointer to drivers structure 2158c2ecf20Sopenharmony_ci * 2168c2ecf20Sopenharmony_ci * Returns 0 on success or non-zero value on failure 2178c2ecf20Sopenharmony_ci */ 2188c2ecf20Sopenharmony_cistatic int tc_dwc_g210_setup_20bit_rmmi(struct ufs_hba *hba) 2198c2ecf20Sopenharmony_ci{ 2208c2ecf20Sopenharmony_ci int ret = 0; 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ci static const struct ufshcd_dme_attr_val setup_attrs[] = { 2238c2ecf20Sopenharmony_ci { UIC_ARG_MIB(TX_GLOBALHIBERNATE), 0x00, DME_LOCAL }, 2248c2ecf20Sopenharmony_ci { UIC_ARG_MIB(REFCLKMODE), 0x01, DME_LOCAL }, 2258c2ecf20Sopenharmony_ci { UIC_ARG_MIB(CDIRECTCTRL6), 0xc0, DME_LOCAL }, 2268c2ecf20Sopenharmony_ci { UIC_ARG_MIB(CBDIVFACTOR), 0x44, DME_LOCAL }, 2278c2ecf20Sopenharmony_ci { UIC_ARG_MIB(CBDCOCTRL5), 0x64, DME_LOCAL }, 2288c2ecf20Sopenharmony_ci { UIC_ARG_MIB(CBPRGTUNING), 0x09, DME_LOCAL }, 2298c2ecf20Sopenharmony_ci { UIC_ARG_MIB(RTOBSERVESELECT), 0x00, DME_LOCAL }, 2308c2ecf20Sopenharmony_ci }; 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci ret = ufshcd_dwc_dme_set_attrs(hba, setup_attrs, 2338c2ecf20Sopenharmony_ci ARRAY_SIZE(setup_attrs)); 2348c2ecf20Sopenharmony_ci if (ret) 2358c2ecf20Sopenharmony_ci goto out; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci /* Lane 0 configuration*/ 2388c2ecf20Sopenharmony_ci ret = tc_dwc_g210_setup_20bit_rmmi_lane0(hba); 2398c2ecf20Sopenharmony_ci if (ret) 2408c2ecf20Sopenharmony_ci goto out; 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci /* Lane 1 configuration*/ 2438c2ecf20Sopenharmony_ci ret = tc_dwc_g210_setup_20bit_rmmi_lane1(hba); 2448c2ecf20Sopenharmony_ci if (ret) 2458c2ecf20Sopenharmony_ci goto out; 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ciout: 2488c2ecf20Sopenharmony_ci return ret; 2498c2ecf20Sopenharmony_ci} 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci/** 2528c2ecf20Sopenharmony_ci * tc_dwc_g210_config_40_bit() 2538c2ecf20Sopenharmony_ci * This function configures Local (host) Synopsys 40-bit TC specific attributes 2548c2ecf20Sopenharmony_ci * 2558c2ecf20Sopenharmony_ci * @hba: Pointer to drivers structure 2568c2ecf20Sopenharmony_ci * 2578c2ecf20Sopenharmony_ci * Returns 0 on success non-zero value on failure 2588c2ecf20Sopenharmony_ci */ 2598c2ecf20Sopenharmony_ciint tc_dwc_g210_config_40_bit(struct ufs_hba *hba) 2608c2ecf20Sopenharmony_ci{ 2618c2ecf20Sopenharmony_ci int ret = 0; 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci dev_info(hba->dev, "Configuring Test Chip 40-bit RMMI\n"); 2648c2ecf20Sopenharmony_ci ret = tc_dwc_g210_setup_40bit_rmmi(hba); 2658c2ecf20Sopenharmony_ci if (ret) { 2668c2ecf20Sopenharmony_ci dev_err(hba->dev, "Configuration failed\n"); 2678c2ecf20Sopenharmony_ci goto out; 2688c2ecf20Sopenharmony_ci } 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci /* To write Shadow register bank to effective configuration block */ 2718c2ecf20Sopenharmony_ci ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_MPHYCFGUPDT), 0x01); 2728c2ecf20Sopenharmony_ci if (ret) 2738c2ecf20Sopenharmony_ci goto out; 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci /* To configure Debug OMC */ 2768c2ecf20Sopenharmony_ci ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_DEBUGOMC), 0x01); 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ciout: 2798c2ecf20Sopenharmony_ci return ret; 2808c2ecf20Sopenharmony_ci} 2818c2ecf20Sopenharmony_ciEXPORT_SYMBOL(tc_dwc_g210_config_40_bit); 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci/** 2848c2ecf20Sopenharmony_ci * tc_dwc_g210_config_20_bit() 2858c2ecf20Sopenharmony_ci * This function configures Local (host) Synopsys 20-bit TC specific attributes 2868c2ecf20Sopenharmony_ci * 2878c2ecf20Sopenharmony_ci * @hba: Pointer to drivers structure 2888c2ecf20Sopenharmony_ci * 2898c2ecf20Sopenharmony_ci * Returns 0 on success non-zero value on failure 2908c2ecf20Sopenharmony_ci */ 2918c2ecf20Sopenharmony_ciint tc_dwc_g210_config_20_bit(struct ufs_hba *hba) 2928c2ecf20Sopenharmony_ci{ 2938c2ecf20Sopenharmony_ci int ret = 0; 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci dev_info(hba->dev, "Configuring Test Chip 20-bit RMMI\n"); 2968c2ecf20Sopenharmony_ci ret = tc_dwc_g210_setup_20bit_rmmi(hba); 2978c2ecf20Sopenharmony_ci if (ret) { 2988c2ecf20Sopenharmony_ci dev_err(hba->dev, "Configuration failed\n"); 2998c2ecf20Sopenharmony_ci goto out; 3008c2ecf20Sopenharmony_ci } 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_ci /* To write Shadow register bank to effective configuration block */ 3038c2ecf20Sopenharmony_ci ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_MPHYCFGUPDT), 0x01); 3048c2ecf20Sopenharmony_ci if (ret) 3058c2ecf20Sopenharmony_ci goto out; 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci /* To configure Debug OMC */ 3088c2ecf20Sopenharmony_ci ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_DEBUGOMC), 0x01); 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ciout: 3118c2ecf20Sopenharmony_ci return ret; 3128c2ecf20Sopenharmony_ci} 3138c2ecf20Sopenharmony_ciEXPORT_SYMBOL(tc_dwc_g210_config_20_bit); 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ciMODULE_AUTHOR("Joao Pinto <Joao.Pinto@synopsys.com>"); 3168c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Synopsys G210 Test Chip driver"); 3178c2ecf20Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL"); 318