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