1dd11376bSBart Van Assche // SPDX-License-Identifier: GPL-2.0-only
2dd11376bSBart Van Assche /*
3dd11376bSBart Van Assche * Synopsys G210 Test Chip driver
4dd11376bSBart Van Assche *
5dd11376bSBart Van Assche * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com)
6dd11376bSBart Van Assche *
7dd11376bSBart Van Assche * Authors: Joao Pinto <jpinto@synopsys.com>
8dd11376bSBart Van Assche */
9dd11376bSBart Van Assche
10dd11376bSBart Van Assche #include <linux/module.h>
11dd11376bSBart Van Assche
12dd11376bSBart Van Assche #include <ufs/ufshcd.h>
13dd11376bSBart Van Assche #include <ufs/unipro.h>
14dd11376bSBart Van Assche
15dd11376bSBart Van Assche #include "ufshcd-dwc.h"
16dd11376bSBart Van Assche #include "ufshci-dwc.h"
17dd11376bSBart Van Assche #include "tc-dwc-g210.h"
18dd11376bSBart Van Assche
19dd11376bSBart Van Assche /**
20*8d8af294SBart Van Assche * tc_dwc_g210_setup_40bit_rmmi() - configure 40-bit RMMI.
21dd11376bSBart Van Assche * @hba: Pointer to drivers structure
22dd11376bSBart Van Assche *
233a17fefeSBart Van Assche * Return: 0 on success or non-zero value on failure.
24dd11376bSBart Van Assche */
tc_dwc_g210_setup_40bit_rmmi(struct ufs_hba * hba)25dd11376bSBart Van Assche static int tc_dwc_g210_setup_40bit_rmmi(struct ufs_hba *hba)
26dd11376bSBart Van Assche {
27dd11376bSBart Van Assche static const struct ufshcd_dme_attr_val setup_attrs[] = {
28dd11376bSBart Van Assche { UIC_ARG_MIB(TX_GLOBALHIBERNATE), 0x00, DME_LOCAL },
29dd11376bSBart Van Assche { UIC_ARG_MIB(REFCLKMODE), 0x01, DME_LOCAL },
30dd11376bSBart Van Assche { UIC_ARG_MIB(CDIRECTCTRL6), 0x80, DME_LOCAL },
31dd11376bSBart Van Assche { UIC_ARG_MIB(CBDIVFACTOR), 0x08, DME_LOCAL },
32dd11376bSBart Van Assche { UIC_ARG_MIB(CBDCOCTRL5), 0x64, DME_LOCAL },
33dd11376bSBart Van Assche { UIC_ARG_MIB(CBPRGTUNING), 0x09, DME_LOCAL },
34dd11376bSBart Van Assche { UIC_ARG_MIB(RTOBSERVESELECT), 0x00, DME_LOCAL },
35dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(TX_REFCLKFREQ, SELIND_LN0_TX), 0x01,
36dd11376bSBart Van Assche DME_LOCAL },
37dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL, SELIND_LN0_TX), 0x19,
38dd11376bSBart Van Assche DME_LOCAL },
39dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGEXTRATTR, SELIND_LN0_TX), 0x14,
40dd11376bSBart Van Assche DME_LOCAL },
41dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(DITHERCTRL2, SELIND_LN0_TX), 0xd6,
42dd11376bSBart Van Assche DME_LOCAL },
43dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RX_REFCLKFREQ, SELIND_LN0_RX), 0x01,
44dd11376bSBart Van Assche DME_LOCAL },
45dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL, SELIND_LN0_RX), 0x19,
46dd11376bSBart Van Assche DME_LOCAL },
47dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGWIDEINLN, SELIND_LN0_RX), 4,
48dd11376bSBart Van Assche DME_LOCAL },
49dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN0_RX), 0x80,
50dd11376bSBart Van Assche DME_LOCAL },
51dd11376bSBart Van Assche { UIC_ARG_MIB(DIRECTCTRL10), 0x04, DME_LOCAL },
52dd11376bSBart Van Assche { UIC_ARG_MIB(DIRECTCTRL19), 0x02, DME_LOCAL },
53dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN0_RX), 0x80,
54dd11376bSBart Van Assche DME_LOCAL },
55dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(ENARXDIRECTCFG4, SELIND_LN0_RX), 0x03,
56dd11376bSBart Van Assche DME_LOCAL },
57dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXOVR8, SELIND_LN0_RX), 0x16,
58dd11376bSBart Van Assche DME_LOCAL },
59dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RXDIRECTCTRL2, SELIND_LN0_RX), 0x42,
60dd11376bSBart Van Assche DME_LOCAL },
61dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(ENARXDIRECTCFG3, SELIND_LN0_RX), 0xa4,
62dd11376bSBart Van Assche DME_LOCAL },
63dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RXCALCTRL, SELIND_LN0_RX), 0x01,
64dd11376bSBart Van Assche DME_LOCAL },
65dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(ENARXDIRECTCFG2, SELIND_LN0_RX), 0x01,
66dd11376bSBart Van Assche DME_LOCAL },
67dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXOVR4, SELIND_LN0_RX), 0x28,
68dd11376bSBart Van Assche DME_LOCAL },
69dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RXSQCTRL, SELIND_LN0_RX), 0x1E,
70dd11376bSBart Van Assche DME_LOCAL },
71dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN0_RX), 0x2f,
72dd11376bSBart Van Assche DME_LOCAL },
73dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN0_RX), 0x2f,
74dd11376bSBart Van Assche DME_LOCAL },
75dd11376bSBart Van Assche { UIC_ARG_MIB(CBPRGPLL2), 0x00, DME_LOCAL },
76dd11376bSBart Van Assche };
77dd11376bSBart Van Assche
78dd11376bSBart Van Assche return ufshcd_dwc_dme_set_attrs(hba, setup_attrs,
79dd11376bSBart Van Assche ARRAY_SIZE(setup_attrs));
80dd11376bSBart Van Assche }
81dd11376bSBart Van Assche
82dd11376bSBart Van Assche /**
83*8d8af294SBart Van Assche * tc_dwc_g210_setup_20bit_rmmi_lane0() - configure 20-bit RMMI Lane 0.
84dd11376bSBart Van Assche * @hba: Pointer to drivers structure
85dd11376bSBart Van Assche *
863a17fefeSBart Van Assche * Return: 0 on success or non-zero value on failure.
87dd11376bSBart Van Assche */
tc_dwc_g210_setup_20bit_rmmi_lane0(struct ufs_hba * hba)88dd11376bSBart Van Assche static int tc_dwc_g210_setup_20bit_rmmi_lane0(struct ufs_hba *hba)
89dd11376bSBart Van Assche {
90dd11376bSBart Van Assche static const struct ufshcd_dme_attr_val setup_attrs[] = {
91dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(TX_REFCLKFREQ, SELIND_LN0_TX), 0x01,
92dd11376bSBart Van Assche DME_LOCAL },
93dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL, SELIND_LN0_TX), 0x19,
94dd11376bSBart Van Assche DME_LOCAL },
95dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL, SELIND_LN0_RX), 0x19,
96dd11376bSBart Van Assche DME_LOCAL },
97dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGEXTRATTR, SELIND_LN0_TX), 0x12,
98dd11376bSBart Van Assche DME_LOCAL },
99dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(DITHERCTRL2, SELIND_LN0_TX), 0xd6,
100dd11376bSBart Van Assche DME_LOCAL },
101dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RX_REFCLKFREQ, SELIND_LN0_RX), 0x01,
102dd11376bSBart Van Assche DME_LOCAL },
103dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGWIDEINLN, SELIND_LN0_RX), 2,
104dd11376bSBart Van Assche DME_LOCAL },
105dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN0_RX), 0x80,
106dd11376bSBart Van Assche DME_LOCAL },
107dd11376bSBart Van Assche { UIC_ARG_MIB(DIRECTCTRL10), 0x04, DME_LOCAL },
108dd11376bSBart Van Assche { UIC_ARG_MIB(DIRECTCTRL19), 0x02, DME_LOCAL },
109dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(ENARXDIRECTCFG4, SELIND_LN0_RX), 0x03,
110dd11376bSBart Van Assche DME_LOCAL },
111dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXOVR8, SELIND_LN0_RX), 0x16,
112dd11376bSBart Van Assche DME_LOCAL },
113dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RXDIRECTCTRL2, SELIND_LN0_RX), 0x42,
114dd11376bSBart Van Assche DME_LOCAL },
115dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(ENARXDIRECTCFG3, SELIND_LN0_RX), 0xa4,
116dd11376bSBart Van Assche DME_LOCAL },
117dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RXCALCTRL, SELIND_LN0_RX), 0x01,
118dd11376bSBart Van Assche DME_LOCAL },
119dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(ENARXDIRECTCFG2, SELIND_LN0_RX), 0x01,
120dd11376bSBart Van Assche DME_LOCAL },
121dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXOVR4, SELIND_LN0_RX), 0x28,
122dd11376bSBart Van Assche DME_LOCAL },
123dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RXSQCTRL, SELIND_LN0_RX), 0x1E,
124dd11376bSBart Van Assche DME_LOCAL },
125dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN0_RX), 0x2f,
126dd11376bSBart Van Assche DME_LOCAL },
127dd11376bSBart Van Assche { UIC_ARG_MIB(CBPRGPLL2), 0x00, DME_LOCAL },
128dd11376bSBart Van Assche };
129dd11376bSBart Van Assche
130dd11376bSBart Van Assche return ufshcd_dwc_dme_set_attrs(hba, setup_attrs,
131dd11376bSBart Van Assche ARRAY_SIZE(setup_attrs));
132dd11376bSBart Van Assche }
133dd11376bSBart Van Assche
134dd11376bSBart Van Assche /**
135*8d8af294SBart Van Assche * tc_dwc_g210_setup_20bit_rmmi_lane1() - configure 20-bit RMMI Lane 1.
136dd11376bSBart Van Assche * @hba: Pointer to drivers structure
137dd11376bSBart Van Assche *
1383a17fefeSBart Van Assche * Return: 0 on success or non-zero value on failure.
139dd11376bSBart Van Assche */
tc_dwc_g210_setup_20bit_rmmi_lane1(struct ufs_hba * hba)140dd11376bSBart Van Assche static int tc_dwc_g210_setup_20bit_rmmi_lane1(struct ufs_hba *hba)
141dd11376bSBart Van Assche {
142dd11376bSBart Van Assche int connected_rx_lanes = 0;
143dd11376bSBart Van Assche int connected_tx_lanes = 0;
144dd11376bSBart Van Assche int ret = 0;
145dd11376bSBart Van Assche
146dd11376bSBart Van Assche static const struct ufshcd_dme_attr_val setup_tx_attrs[] = {
147dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(TX_REFCLKFREQ, SELIND_LN1_TX), 0x0d,
148dd11376bSBart Van Assche DME_LOCAL },
149dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL, SELIND_LN1_TX), 0x19,
150dd11376bSBart Van Assche DME_LOCAL },
151dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGEXTRATTR, SELIND_LN1_TX), 0x12,
152dd11376bSBart Van Assche DME_LOCAL },
153dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(DITHERCTRL2, SELIND_LN0_TX), 0xd6,
154dd11376bSBart Van Assche DME_LOCAL },
155dd11376bSBart Van Assche };
156dd11376bSBart Van Assche
157dd11376bSBart Van Assche static const struct ufshcd_dme_attr_val setup_rx_attrs[] = {
158dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RX_REFCLKFREQ, SELIND_LN1_RX), 0x01,
159dd11376bSBart Van Assche DME_LOCAL },
160dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL, SELIND_LN1_RX), 0x19,
161dd11376bSBart Van Assche DME_LOCAL },
162dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGWIDEINLN, SELIND_LN1_RX), 2,
163dd11376bSBart Van Assche DME_LOCAL },
164dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXCDR8, SELIND_LN1_RX), 0x80,
165dd11376bSBart Van Assche DME_LOCAL },
166dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(ENARXDIRECTCFG4, SELIND_LN1_RX), 0x03,
167dd11376bSBart Van Assche DME_LOCAL },
168dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXOVR8, SELIND_LN1_RX), 0x16,
169dd11376bSBart Van Assche DME_LOCAL },
170dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RXDIRECTCTRL2, SELIND_LN1_RX), 0x42,
171dd11376bSBart Van Assche DME_LOCAL },
172dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(ENARXDIRECTCFG3, SELIND_LN1_RX), 0xa4,
173dd11376bSBart Van Assche DME_LOCAL },
174dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RXCALCTRL, SELIND_LN1_RX), 0x01,
175dd11376bSBart Van Assche DME_LOCAL },
176dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(ENARXDIRECTCFG2, SELIND_LN1_RX), 0x01,
177dd11376bSBart Van Assche DME_LOCAL },
178dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXOVR4, SELIND_LN1_RX), 0x28,
179dd11376bSBart Van Assche DME_LOCAL },
180dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(RXSQCTRL, SELIND_LN1_RX), 0x1E,
181dd11376bSBart Van Assche DME_LOCAL },
182dd11376bSBart Van Assche { UIC_ARG_MIB_SEL(CFGRXOVR6, SELIND_LN1_RX), 0x2f,
183dd11376bSBart Van Assche DME_LOCAL },
184dd11376bSBart Van Assche };
185dd11376bSBart Van Assche
186dd11376bSBart Van Assche /* Get the available lane count */
187dd11376bSBart Van Assche ufshcd_dme_get(hba, UIC_ARG_MIB(PA_AVAILRXDATALANES),
188dd11376bSBart Van Assche &connected_rx_lanes);
189dd11376bSBart Van Assche ufshcd_dme_get(hba, UIC_ARG_MIB(PA_AVAILTXDATALANES),
190dd11376bSBart Van Assche &connected_tx_lanes);
191dd11376bSBart Van Assche
192dd11376bSBart Van Assche if (connected_tx_lanes == 2) {
193dd11376bSBart Van Assche
194dd11376bSBart Van Assche ret = ufshcd_dwc_dme_set_attrs(hba, setup_tx_attrs,
195dd11376bSBart Van Assche ARRAY_SIZE(setup_tx_attrs));
196dd11376bSBart Van Assche
197dd11376bSBart Van Assche if (ret)
198dd11376bSBart Van Assche goto out;
199dd11376bSBart Van Assche }
200dd11376bSBart Van Assche
201dd11376bSBart Van Assche if (connected_rx_lanes == 2) {
202dd11376bSBart Van Assche ret = ufshcd_dwc_dme_set_attrs(hba, setup_rx_attrs,
203dd11376bSBart Van Assche ARRAY_SIZE(setup_rx_attrs));
204dd11376bSBart Van Assche }
205dd11376bSBart Van Assche
206dd11376bSBart Van Assche out:
207dd11376bSBart Van Assche return ret;
208dd11376bSBart Van Assche }
209dd11376bSBart Van Assche
210dd11376bSBart Van Assche /**
211*8d8af294SBart Van Assche * tc_dwc_g210_setup_20bit_rmmi() - configure 20-bit RMMI.
212dd11376bSBart Van Assche * @hba: Pointer to drivers structure
213dd11376bSBart Van Assche *
2143a17fefeSBart Van Assche * Return: 0 on success or non-zero value on failure.
215dd11376bSBart Van Assche */
tc_dwc_g210_setup_20bit_rmmi(struct ufs_hba * hba)216dd11376bSBart Van Assche static int tc_dwc_g210_setup_20bit_rmmi(struct ufs_hba *hba)
217dd11376bSBart Van Assche {
218dd11376bSBart Van Assche int ret = 0;
219dd11376bSBart Van Assche
220dd11376bSBart Van Assche static const struct ufshcd_dme_attr_val setup_attrs[] = {
221dd11376bSBart Van Assche { UIC_ARG_MIB(TX_GLOBALHIBERNATE), 0x00, DME_LOCAL },
222dd11376bSBart Van Assche { UIC_ARG_MIB(REFCLKMODE), 0x01, DME_LOCAL },
223dd11376bSBart Van Assche { UIC_ARG_MIB(CDIRECTCTRL6), 0xc0, DME_LOCAL },
224dd11376bSBart Van Assche { UIC_ARG_MIB(CBDIVFACTOR), 0x44, DME_LOCAL },
225dd11376bSBart Van Assche { UIC_ARG_MIB(CBDCOCTRL5), 0x64, DME_LOCAL },
226dd11376bSBart Van Assche { UIC_ARG_MIB(CBPRGTUNING), 0x09, DME_LOCAL },
227dd11376bSBart Van Assche { UIC_ARG_MIB(RTOBSERVESELECT), 0x00, DME_LOCAL },
228dd11376bSBart Van Assche };
229dd11376bSBart Van Assche
230dd11376bSBart Van Assche ret = ufshcd_dwc_dme_set_attrs(hba, setup_attrs,
231dd11376bSBart Van Assche ARRAY_SIZE(setup_attrs));
232dd11376bSBart Van Assche if (ret)
233dd11376bSBart Van Assche goto out;
234dd11376bSBart Van Assche
235dd11376bSBart Van Assche /* Lane 0 configuration*/
236dd11376bSBart Van Assche ret = tc_dwc_g210_setup_20bit_rmmi_lane0(hba);
237dd11376bSBart Van Assche if (ret)
238dd11376bSBart Van Assche goto out;
239dd11376bSBart Van Assche
240dd11376bSBart Van Assche /* Lane 1 configuration*/
241dd11376bSBart Van Assche ret = tc_dwc_g210_setup_20bit_rmmi_lane1(hba);
242dd11376bSBart Van Assche if (ret)
243dd11376bSBart Van Assche goto out;
244dd11376bSBart Van Assche
245dd11376bSBart Van Assche out:
246dd11376bSBart Van Assche return ret;
247dd11376bSBart Van Assche }
248dd11376bSBart Van Assche
249dd11376bSBart Van Assche /**
250*8d8af294SBart Van Assche * tc_dwc_g210_config_40_bit() - configure 40-bit TC specific attributes.
251dd11376bSBart Van Assche * @hba: Pointer to drivers structure
252dd11376bSBart Van Assche *
2533a17fefeSBart Van Assche * Return: 0 on success non-zero value on failure.
254dd11376bSBart Van Assche */
tc_dwc_g210_config_40_bit(struct ufs_hba * hba)255dd11376bSBart Van Assche int tc_dwc_g210_config_40_bit(struct ufs_hba *hba)
256dd11376bSBart Van Assche {
257dd11376bSBart Van Assche int ret = 0;
258dd11376bSBart Van Assche
259dd11376bSBart Van Assche dev_info(hba->dev, "Configuring Test Chip 40-bit RMMI\n");
260dd11376bSBart Van Assche ret = tc_dwc_g210_setup_40bit_rmmi(hba);
261dd11376bSBart Van Assche if (ret) {
262dd11376bSBart Van Assche dev_err(hba->dev, "Configuration failed\n");
263dd11376bSBart Van Assche goto out;
264dd11376bSBart Van Assche }
265dd11376bSBart Van Assche
266dd11376bSBart Van Assche /* To write Shadow register bank to effective configuration block */
267dd11376bSBart Van Assche ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_MPHYCFGUPDT), 0x01);
268dd11376bSBart Van Assche if (ret)
269dd11376bSBart Van Assche goto out;
270dd11376bSBart Van Assche
271dd11376bSBart Van Assche /* To configure Debug OMC */
272dd11376bSBart Van Assche ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_DEBUGOMC), 0x01);
273dd11376bSBart Van Assche
274dd11376bSBart Van Assche out:
275dd11376bSBart Van Assche return ret;
276dd11376bSBart Van Assche }
277dd11376bSBart Van Assche EXPORT_SYMBOL(tc_dwc_g210_config_40_bit);
278dd11376bSBart Van Assche
279dd11376bSBart Van Assche /**
280*8d8af294SBart Van Assche * tc_dwc_g210_config_20_bit() - configure 20-bit TC specific attributes.
281dd11376bSBart Van Assche * @hba: Pointer to drivers structure
282dd11376bSBart Van Assche *
2833a17fefeSBart Van Assche * Return: 0 on success non-zero value on failure.
284dd11376bSBart Van Assche */
tc_dwc_g210_config_20_bit(struct ufs_hba * hba)285dd11376bSBart Van Assche int tc_dwc_g210_config_20_bit(struct ufs_hba *hba)
286dd11376bSBart Van Assche {
287dd11376bSBart Van Assche int ret = 0;
288dd11376bSBart Van Assche
289dd11376bSBart Van Assche dev_info(hba->dev, "Configuring Test Chip 20-bit RMMI\n");
290dd11376bSBart Van Assche ret = tc_dwc_g210_setup_20bit_rmmi(hba);
291dd11376bSBart Van Assche if (ret) {
292dd11376bSBart Van Assche dev_err(hba->dev, "Configuration failed\n");
293dd11376bSBart Van Assche goto out;
294dd11376bSBart Van Assche }
295dd11376bSBart Van Assche
296dd11376bSBart Van Assche /* To write Shadow register bank to effective configuration block */
297dd11376bSBart Van Assche ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_MPHYCFGUPDT), 0x01);
298dd11376bSBart Van Assche if (ret)
299dd11376bSBart Van Assche goto out;
300dd11376bSBart Van Assche
301dd11376bSBart Van Assche /* To configure Debug OMC */
302dd11376bSBart Van Assche ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_DEBUGOMC), 0x01);
303dd11376bSBart Van Assche
304dd11376bSBart Van Assche out:
305dd11376bSBart Van Assche return ret;
306dd11376bSBart Van Assche }
307dd11376bSBart Van Assche EXPORT_SYMBOL(tc_dwc_g210_config_20_bit);
308dd11376bSBart Van Assche
309dd11376bSBart Van Assche MODULE_AUTHOR("Joao Pinto <Joao.Pinto@synopsys.com>");
310dd11376bSBart Van Assche MODULE_DESCRIPTION("Synopsys G210 Test Chip driver");
311dd11376bSBart Van Assche MODULE_LICENSE("Dual BSD/GPL");
312