162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Synopsys G210 Test Chip driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com)
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Authors: Joao Pinto <jpinto@synopsys.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/module.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <ufs/ufshcd.h>
1362306a36Sopenharmony_ci#include <ufs/unipro.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include "ufshcd-dwc.h"
1662306a36Sopenharmony_ci#include "ufshci-dwc.h"
1762306a36Sopenharmony_ci#include "tc-dwc-g210.h"
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/**
2062306a36Sopenharmony_ci * tc_dwc_g210_setup_40bit_rmmi() - configure 40-bit RMMI.
2162306a36Sopenharmony_ci * @hba: Pointer to drivers structure
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci * Return: 0 on success or non-zero value on failure.
2462306a36Sopenharmony_ci */
2562306a36Sopenharmony_cistatic int tc_dwc_g210_setup_40bit_rmmi(struct ufs_hba *hba)
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	static const struct ufshcd_dme_attr_val setup_attrs[] = {
2862306a36Sopenharmony_ci		{ UIC_ARG_MIB(TX_GLOBALHIBERNATE), 0x00, DME_LOCAL },
2962306a36Sopenharmony_ci		{ UIC_ARG_MIB(REFCLKMODE), 0x01, DME_LOCAL },
3062306a36Sopenharmony_ci		{ UIC_ARG_MIB(CDIRECTCTRL6), 0x80, DME_LOCAL },
3162306a36Sopenharmony_ci		{ UIC_ARG_MIB(CBDIVFACTOR), 0x08, DME_LOCAL },
3262306a36Sopenharmony_ci		{ UIC_ARG_MIB(CBDCOCTRL5), 0x64, DME_LOCAL },
3362306a36Sopenharmony_ci		{ UIC_ARG_MIB(CBPRGTUNING), 0x09, DME_LOCAL },
3462306a36Sopenharmony_ci		{ UIC_ARG_MIB(RTOBSERVESELECT), 0x00, DME_LOCAL },
3562306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(TX_REFCLKFREQ, SELIND_LN0_TX), 0x01,
3662306a36Sopenharmony_ci								DME_LOCAL },
3762306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL, SELIND_LN0_TX), 0x19,
3862306a36Sopenharmony_ci								DME_LOCAL },
3962306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGEXTRATTR, SELIND_LN0_TX), 0x14,
4062306a36Sopenharmony_ci								DME_LOCAL },
4162306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(DITHERCTRL2, SELIND_LN0_TX), 0xd6,
4262306a36Sopenharmony_ci								DME_LOCAL },
4362306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RX_REFCLKFREQ, SELIND_LN0_RX), 0x01,
4462306a36Sopenharmony_ci								DME_LOCAL },
4562306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL, SELIND_LN0_RX), 0x19,
4662306a36Sopenharmony_ci								DME_LOCAL },
4762306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGWIDEINLN, SELIND_LN0_RX), 4,
4862306a36Sopenharmony_ci								DME_LOCAL },
4962306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN0_RX), 0x80,
5062306a36Sopenharmony_ci								DME_LOCAL },
5162306a36Sopenharmony_ci		{ UIC_ARG_MIB(DIRECTCTRL10), 0x04, DME_LOCAL },
5262306a36Sopenharmony_ci		{ UIC_ARG_MIB(DIRECTCTRL19), 0x02, DME_LOCAL },
5362306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN0_RX), 0x80,
5462306a36Sopenharmony_ci								DME_LOCAL },
5562306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(ENARXDIRECTCFG4, SELIND_LN0_RX), 0x03,
5662306a36Sopenharmony_ci								DME_LOCAL },
5762306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXOVR8, SELIND_LN0_RX), 0x16,
5862306a36Sopenharmony_ci								DME_LOCAL },
5962306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RXDIRECTCTRL2, SELIND_LN0_RX), 0x42,
6062306a36Sopenharmony_ci								DME_LOCAL },
6162306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(ENARXDIRECTCFG3, SELIND_LN0_RX), 0xa4,
6262306a36Sopenharmony_ci								DME_LOCAL },
6362306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RXCALCTRL, SELIND_LN0_RX), 0x01,
6462306a36Sopenharmony_ci								DME_LOCAL },
6562306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(ENARXDIRECTCFG2, SELIND_LN0_RX), 0x01,
6662306a36Sopenharmony_ci								DME_LOCAL },
6762306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXOVR4, SELIND_LN0_RX), 0x28,
6862306a36Sopenharmony_ci								DME_LOCAL },
6962306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RXSQCTRL, SELIND_LN0_RX), 0x1E,
7062306a36Sopenharmony_ci								DME_LOCAL },
7162306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN0_RX), 0x2f,
7262306a36Sopenharmony_ci								DME_LOCAL },
7362306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN0_RX), 0x2f,
7462306a36Sopenharmony_ci								DME_LOCAL },
7562306a36Sopenharmony_ci		{ UIC_ARG_MIB(CBPRGPLL2), 0x00, DME_LOCAL },
7662306a36Sopenharmony_ci	};
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	return ufshcd_dwc_dme_set_attrs(hba, setup_attrs,
7962306a36Sopenharmony_ci						ARRAY_SIZE(setup_attrs));
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci/**
8362306a36Sopenharmony_ci * tc_dwc_g210_setup_20bit_rmmi_lane0() - configure 20-bit RMMI Lane 0.
8462306a36Sopenharmony_ci * @hba: Pointer to drivers structure
8562306a36Sopenharmony_ci *
8662306a36Sopenharmony_ci * Return: 0 on success or non-zero value on failure.
8762306a36Sopenharmony_ci */
8862306a36Sopenharmony_cistatic int tc_dwc_g210_setup_20bit_rmmi_lane0(struct ufs_hba *hba)
8962306a36Sopenharmony_ci{
9062306a36Sopenharmony_ci	static const struct ufshcd_dme_attr_val setup_attrs[] = {
9162306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(TX_REFCLKFREQ, SELIND_LN0_TX), 0x01,
9262306a36Sopenharmony_ci								DME_LOCAL },
9362306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL, SELIND_LN0_TX), 0x19,
9462306a36Sopenharmony_ci								DME_LOCAL },
9562306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL, SELIND_LN0_RX), 0x19,
9662306a36Sopenharmony_ci								DME_LOCAL },
9762306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGEXTRATTR, SELIND_LN0_TX), 0x12,
9862306a36Sopenharmony_ci								DME_LOCAL },
9962306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(DITHERCTRL2, SELIND_LN0_TX), 0xd6,
10062306a36Sopenharmony_ci								DME_LOCAL },
10162306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RX_REFCLKFREQ, SELIND_LN0_RX), 0x01,
10262306a36Sopenharmony_ci								DME_LOCAL },
10362306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGWIDEINLN, SELIND_LN0_RX), 2,
10462306a36Sopenharmony_ci								DME_LOCAL },
10562306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN0_RX), 0x80,
10662306a36Sopenharmony_ci								DME_LOCAL },
10762306a36Sopenharmony_ci		{ UIC_ARG_MIB(DIRECTCTRL10), 0x04, DME_LOCAL },
10862306a36Sopenharmony_ci		{ UIC_ARG_MIB(DIRECTCTRL19), 0x02, DME_LOCAL },
10962306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(ENARXDIRECTCFG4, SELIND_LN0_RX), 0x03,
11062306a36Sopenharmony_ci								DME_LOCAL },
11162306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXOVR8, SELIND_LN0_RX), 0x16,
11262306a36Sopenharmony_ci								DME_LOCAL },
11362306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RXDIRECTCTRL2, SELIND_LN0_RX), 0x42,
11462306a36Sopenharmony_ci								DME_LOCAL },
11562306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(ENARXDIRECTCFG3, SELIND_LN0_RX), 0xa4,
11662306a36Sopenharmony_ci								DME_LOCAL },
11762306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RXCALCTRL, SELIND_LN0_RX), 0x01,
11862306a36Sopenharmony_ci								DME_LOCAL },
11962306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(ENARXDIRECTCFG2, SELIND_LN0_RX), 0x01,
12062306a36Sopenharmony_ci								DME_LOCAL },
12162306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXOVR4, SELIND_LN0_RX), 0x28,
12262306a36Sopenharmony_ci								DME_LOCAL },
12362306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RXSQCTRL, SELIND_LN0_RX), 0x1E,
12462306a36Sopenharmony_ci								DME_LOCAL },
12562306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN0_RX), 0x2f,
12662306a36Sopenharmony_ci								DME_LOCAL },
12762306a36Sopenharmony_ci		{ UIC_ARG_MIB(CBPRGPLL2), 0x00, DME_LOCAL },
12862306a36Sopenharmony_ci	};
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	return ufshcd_dwc_dme_set_attrs(hba, setup_attrs,
13162306a36Sopenharmony_ci						ARRAY_SIZE(setup_attrs));
13262306a36Sopenharmony_ci}
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci/**
13562306a36Sopenharmony_ci * tc_dwc_g210_setup_20bit_rmmi_lane1() - configure 20-bit RMMI Lane 1.
13662306a36Sopenharmony_ci * @hba: Pointer to drivers structure
13762306a36Sopenharmony_ci *
13862306a36Sopenharmony_ci * Return: 0 on success or non-zero value on failure.
13962306a36Sopenharmony_ci */
14062306a36Sopenharmony_cistatic int tc_dwc_g210_setup_20bit_rmmi_lane1(struct ufs_hba *hba)
14162306a36Sopenharmony_ci{
14262306a36Sopenharmony_ci	int connected_rx_lanes = 0;
14362306a36Sopenharmony_ci	int connected_tx_lanes = 0;
14462306a36Sopenharmony_ci	int ret = 0;
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci	static const struct ufshcd_dme_attr_val setup_tx_attrs[] = {
14762306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(TX_REFCLKFREQ, SELIND_LN1_TX), 0x0d,
14862306a36Sopenharmony_ci								DME_LOCAL },
14962306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL, SELIND_LN1_TX), 0x19,
15062306a36Sopenharmony_ci								DME_LOCAL },
15162306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGEXTRATTR, SELIND_LN1_TX), 0x12,
15262306a36Sopenharmony_ci								DME_LOCAL },
15362306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(DITHERCTRL2, SELIND_LN0_TX), 0xd6,
15462306a36Sopenharmony_ci								DME_LOCAL },
15562306a36Sopenharmony_ci	};
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	static const struct ufshcd_dme_attr_val setup_rx_attrs[] = {
15862306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RX_REFCLKFREQ, SELIND_LN1_RX), 0x01,
15962306a36Sopenharmony_ci								DME_LOCAL },
16062306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL, SELIND_LN1_RX), 0x19,
16162306a36Sopenharmony_ci								DME_LOCAL },
16262306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGWIDEINLN, SELIND_LN1_RX), 2,
16362306a36Sopenharmony_ci								DME_LOCAL },
16462306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN1_RX), 0x80,
16562306a36Sopenharmony_ci								DME_LOCAL },
16662306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(ENARXDIRECTCFG4, SELIND_LN1_RX), 0x03,
16762306a36Sopenharmony_ci								DME_LOCAL },
16862306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXOVR8, SELIND_LN1_RX), 0x16,
16962306a36Sopenharmony_ci								DME_LOCAL },
17062306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RXDIRECTCTRL2, SELIND_LN1_RX), 0x42,
17162306a36Sopenharmony_ci								DME_LOCAL },
17262306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(ENARXDIRECTCFG3, SELIND_LN1_RX), 0xa4,
17362306a36Sopenharmony_ci								DME_LOCAL },
17462306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RXCALCTRL, SELIND_LN1_RX), 0x01,
17562306a36Sopenharmony_ci								DME_LOCAL },
17662306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(ENARXDIRECTCFG2, SELIND_LN1_RX), 0x01,
17762306a36Sopenharmony_ci								DME_LOCAL },
17862306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXOVR4, SELIND_LN1_RX), 0x28,
17962306a36Sopenharmony_ci								DME_LOCAL },
18062306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(RXSQCTRL, SELIND_LN1_RX), 0x1E,
18162306a36Sopenharmony_ci								DME_LOCAL },
18262306a36Sopenharmony_ci		{ UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN1_RX), 0x2f,
18362306a36Sopenharmony_ci								DME_LOCAL },
18462306a36Sopenharmony_ci	};
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci	/* Get the available lane count */
18762306a36Sopenharmony_ci	ufshcd_dme_get(hba, UIC_ARG_MIB(PA_AVAILRXDATALANES),
18862306a36Sopenharmony_ci			&connected_rx_lanes);
18962306a36Sopenharmony_ci	ufshcd_dme_get(hba, UIC_ARG_MIB(PA_AVAILTXDATALANES),
19062306a36Sopenharmony_ci			&connected_tx_lanes);
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci	if (connected_tx_lanes == 2) {
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci		ret = ufshcd_dwc_dme_set_attrs(hba, setup_tx_attrs,
19562306a36Sopenharmony_ci						ARRAY_SIZE(setup_tx_attrs));
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci		if (ret)
19862306a36Sopenharmony_ci			goto out;
19962306a36Sopenharmony_ci	}
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	if (connected_rx_lanes == 2) {
20262306a36Sopenharmony_ci		ret = ufshcd_dwc_dme_set_attrs(hba, setup_rx_attrs,
20362306a36Sopenharmony_ci						ARRAY_SIZE(setup_rx_attrs));
20462306a36Sopenharmony_ci	}
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ciout:
20762306a36Sopenharmony_ci	return ret;
20862306a36Sopenharmony_ci}
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci/**
21162306a36Sopenharmony_ci * tc_dwc_g210_setup_20bit_rmmi() - configure 20-bit RMMI.
21262306a36Sopenharmony_ci * @hba: Pointer to drivers structure
21362306a36Sopenharmony_ci *
21462306a36Sopenharmony_ci * Return: 0 on success or non-zero value on failure.
21562306a36Sopenharmony_ci */
21662306a36Sopenharmony_cistatic int tc_dwc_g210_setup_20bit_rmmi(struct ufs_hba *hba)
21762306a36Sopenharmony_ci{
21862306a36Sopenharmony_ci	int ret = 0;
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	static const struct ufshcd_dme_attr_val setup_attrs[] = {
22162306a36Sopenharmony_ci		{ UIC_ARG_MIB(TX_GLOBALHIBERNATE), 0x00, DME_LOCAL },
22262306a36Sopenharmony_ci		{ UIC_ARG_MIB(REFCLKMODE), 0x01, DME_LOCAL },
22362306a36Sopenharmony_ci		{ UIC_ARG_MIB(CDIRECTCTRL6), 0xc0, DME_LOCAL },
22462306a36Sopenharmony_ci		{ UIC_ARG_MIB(CBDIVFACTOR), 0x44, DME_LOCAL },
22562306a36Sopenharmony_ci		{ UIC_ARG_MIB(CBDCOCTRL5), 0x64, DME_LOCAL },
22662306a36Sopenharmony_ci		{ UIC_ARG_MIB(CBPRGTUNING), 0x09, DME_LOCAL },
22762306a36Sopenharmony_ci		{ UIC_ARG_MIB(RTOBSERVESELECT), 0x00, DME_LOCAL },
22862306a36Sopenharmony_ci	};
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	ret = ufshcd_dwc_dme_set_attrs(hba, setup_attrs,
23162306a36Sopenharmony_ci						ARRAY_SIZE(setup_attrs));
23262306a36Sopenharmony_ci	if (ret)
23362306a36Sopenharmony_ci		goto out;
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	/* Lane 0 configuration*/
23662306a36Sopenharmony_ci	ret = tc_dwc_g210_setup_20bit_rmmi_lane0(hba);
23762306a36Sopenharmony_ci	if (ret)
23862306a36Sopenharmony_ci		goto out;
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci	/* Lane 1 configuration*/
24162306a36Sopenharmony_ci	ret = tc_dwc_g210_setup_20bit_rmmi_lane1(hba);
24262306a36Sopenharmony_ci	if (ret)
24362306a36Sopenharmony_ci		goto out;
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ciout:
24662306a36Sopenharmony_ci	return ret;
24762306a36Sopenharmony_ci}
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci/**
25062306a36Sopenharmony_ci * tc_dwc_g210_config_40_bit() - configure 40-bit TC specific attributes.
25162306a36Sopenharmony_ci * @hba: Pointer to drivers structure
25262306a36Sopenharmony_ci *
25362306a36Sopenharmony_ci * Return: 0 on success non-zero value on failure.
25462306a36Sopenharmony_ci */
25562306a36Sopenharmony_ciint tc_dwc_g210_config_40_bit(struct ufs_hba *hba)
25662306a36Sopenharmony_ci{
25762306a36Sopenharmony_ci	int ret = 0;
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	dev_info(hba->dev, "Configuring Test Chip 40-bit RMMI\n");
26062306a36Sopenharmony_ci	ret = tc_dwc_g210_setup_40bit_rmmi(hba);
26162306a36Sopenharmony_ci	if (ret) {
26262306a36Sopenharmony_ci		dev_err(hba->dev, "Configuration failed\n");
26362306a36Sopenharmony_ci		goto out;
26462306a36Sopenharmony_ci	}
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	/* To write Shadow register bank to effective configuration block */
26762306a36Sopenharmony_ci	ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_MPHYCFGUPDT), 0x01);
26862306a36Sopenharmony_ci	if (ret)
26962306a36Sopenharmony_ci		goto out;
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci	/* To configure Debug OMC */
27262306a36Sopenharmony_ci	ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_DEBUGOMC), 0x01);
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ciout:
27562306a36Sopenharmony_ci	return ret;
27662306a36Sopenharmony_ci}
27762306a36Sopenharmony_ciEXPORT_SYMBOL(tc_dwc_g210_config_40_bit);
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci/**
28062306a36Sopenharmony_ci * tc_dwc_g210_config_20_bit() - configure 20-bit TC specific attributes.
28162306a36Sopenharmony_ci * @hba: Pointer to drivers structure
28262306a36Sopenharmony_ci *
28362306a36Sopenharmony_ci * Return: 0 on success non-zero value on failure.
28462306a36Sopenharmony_ci */
28562306a36Sopenharmony_ciint tc_dwc_g210_config_20_bit(struct ufs_hba *hba)
28662306a36Sopenharmony_ci{
28762306a36Sopenharmony_ci	int ret = 0;
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci	dev_info(hba->dev, "Configuring Test Chip 20-bit RMMI\n");
29062306a36Sopenharmony_ci	ret = tc_dwc_g210_setup_20bit_rmmi(hba);
29162306a36Sopenharmony_ci	if (ret) {
29262306a36Sopenharmony_ci		dev_err(hba->dev, "Configuration failed\n");
29362306a36Sopenharmony_ci		goto out;
29462306a36Sopenharmony_ci	}
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	/* To write Shadow register bank to effective configuration block */
29762306a36Sopenharmony_ci	ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_MPHYCFGUPDT), 0x01);
29862306a36Sopenharmony_ci	if (ret)
29962306a36Sopenharmony_ci		goto out;
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci	/* To configure Debug OMC */
30262306a36Sopenharmony_ci	ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_DEBUGOMC), 0x01);
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ciout:
30562306a36Sopenharmony_ci	return ret;
30662306a36Sopenharmony_ci}
30762306a36Sopenharmony_ciEXPORT_SYMBOL(tc_dwc_g210_config_20_bit);
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ciMODULE_AUTHOR("Joao Pinto <Joao.Pinto@synopsys.com>");
31062306a36Sopenharmony_ciMODULE_DESCRIPTION("Synopsys G210 Test Chip driver");
31162306a36Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL");
312