xref: /OK3568_Linux_fs/kernel/drivers/media/usb/dvb-usb-v2/mxl111sf-phy.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  mxl111sf-phy.c - driver for the MaxLinear MXL111SF
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *  Copyright (C) 2010-2014 Michael Krufky <mkrufky@linuxtv.org>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include "mxl111sf-phy.h"
9*4882a593Smuzhiyun #include "mxl111sf-reg.h"
10*4882a593Smuzhiyun 
mxl111sf_init_tuner_demod(struct mxl111sf_state * state)11*4882a593Smuzhiyun int mxl111sf_init_tuner_demod(struct mxl111sf_state *state)
12*4882a593Smuzhiyun {
13*4882a593Smuzhiyun 	struct mxl111sf_reg_ctrl_info mxl_111_overwrite_default[] = {
14*4882a593Smuzhiyun 		{0x07, 0xff, 0x0c},
15*4882a593Smuzhiyun 		{0x58, 0xff, 0x9d},
16*4882a593Smuzhiyun 		{0x09, 0xff, 0x00},
17*4882a593Smuzhiyun 		{0x06, 0xff, 0x06},
18*4882a593Smuzhiyun 		{0xc8, 0xff, 0x40}, /* ED_LE_WIN_OLD = 0 */
19*4882a593Smuzhiyun 		{0x8d, 0x01, 0x01}, /* NEGATE_Q */
20*4882a593Smuzhiyun 		{0x32, 0xff, 0xac}, /* DIG_RFREFSELECT = 12 */
21*4882a593Smuzhiyun 		{0x42, 0xff, 0x43}, /* DIG_REG_AMP = 4 */
22*4882a593Smuzhiyun 		{0x74, 0xff, 0xc4}, /* SSPUR_FS_PRIO = 4 */
23*4882a593Smuzhiyun 		{0x71, 0xff, 0xe6}, /* SPUR_ROT_PRIO_VAL = 1 */
24*4882a593Smuzhiyun 		{0x83, 0xff, 0x64}, /* INF_FILT1_THD_SC = 100 */
25*4882a593Smuzhiyun 		{0x85, 0xff, 0x64}, /* INF_FILT2_THD_SC = 100 */
26*4882a593Smuzhiyun 		{0x88, 0xff, 0xf0}, /* INF_THD = 240 */
27*4882a593Smuzhiyun 		{0x6f, 0xf0, 0xb0}, /* DFE_DLY = 11 */
28*4882a593Smuzhiyun 		{0x00, 0xff, 0x01}, /* Change to page 1 */
29*4882a593Smuzhiyun 		{0x81, 0xff, 0x11}, /* DSM_FERR_BYPASS = 1 */
30*4882a593Smuzhiyun 		{0xf4, 0xff, 0x07}, /* DIG_FREQ_CORR = 1 */
31*4882a593Smuzhiyun 		{0xd4, 0x1f, 0x0f}, /* SPUR_TEST_NOISE_TH = 15 */
32*4882a593Smuzhiyun 		{0xd6, 0xff, 0x0c}, /* SPUR_TEST_NOISE_PAPR = 12 */
33*4882a593Smuzhiyun 		{0x00, 0xff, 0x00}, /* Change to page 0 */
34*4882a593Smuzhiyun 		{0,    0,    0}
35*4882a593Smuzhiyun 	};
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	mxl_debug("()");
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun 	return mxl111sf_ctrl_program_regs(state, mxl_111_overwrite_default);
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun 
mxl1x1sf_soft_reset(struct mxl111sf_state * state)42*4882a593Smuzhiyun int mxl1x1sf_soft_reset(struct mxl111sf_state *state)
43*4882a593Smuzhiyun {
44*4882a593Smuzhiyun 	int ret;
45*4882a593Smuzhiyun 	mxl_debug("()");
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, 0xff, 0x00); /* AIC */
48*4882a593Smuzhiyun 	if (mxl_fail(ret))
49*4882a593Smuzhiyun 		goto fail;
50*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, 0x02, 0x01); /* get out of reset */
51*4882a593Smuzhiyun 	mxl_fail(ret);
52*4882a593Smuzhiyun fail:
53*4882a593Smuzhiyun 	return ret;
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun 
mxl1x1sf_set_device_mode(struct mxl111sf_state * state,int mode)56*4882a593Smuzhiyun int mxl1x1sf_set_device_mode(struct mxl111sf_state *state, int mode)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun 	int ret;
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 	mxl_debug("(%s)", MXL_SOC_MODE == mode ?
61*4882a593Smuzhiyun 		"MXL_SOC_MODE" : "MXL_TUNER_MODE");
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	/* set device mode */
64*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, 0x03,
65*4882a593Smuzhiyun 				 MXL_SOC_MODE == mode ? 0x01 : 0x00);
66*4882a593Smuzhiyun 	if (mxl_fail(ret))
67*4882a593Smuzhiyun 		goto fail;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	ret = mxl111sf_write_reg_mask(state,
70*4882a593Smuzhiyun 				      0x7d, 0x40, MXL_SOC_MODE == mode ?
71*4882a593Smuzhiyun 				      0x00 : /* enable impulse noise filter,
72*4882a593Smuzhiyun 						INF_BYP = 0 */
73*4882a593Smuzhiyun 				      0x40); /* disable impulse noise filter,
74*4882a593Smuzhiyun 						INF_BYP = 1 */
75*4882a593Smuzhiyun 	if (mxl_fail(ret))
76*4882a593Smuzhiyun 		goto fail;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	state->device_mode = mode;
79*4882a593Smuzhiyun fail:
80*4882a593Smuzhiyun 	return ret;
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun /* power up tuner */
mxl1x1sf_top_master_ctrl(struct mxl111sf_state * state,int onoff)84*4882a593Smuzhiyun int mxl1x1sf_top_master_ctrl(struct mxl111sf_state *state, int onoff)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun 	mxl_debug("(%d)", onoff);
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	return mxl111sf_write_reg(state, 0x01, onoff ? 0x01 : 0x00);
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun 
mxl111sf_disable_656_port(struct mxl111sf_state * state)91*4882a593Smuzhiyun int mxl111sf_disable_656_port(struct mxl111sf_state *state)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun 	mxl_debug("()");
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	return mxl111sf_write_reg_mask(state, 0x12, 0x04, 0x00);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun 
mxl111sf_enable_usb_output(struct mxl111sf_state * state)98*4882a593Smuzhiyun int mxl111sf_enable_usb_output(struct mxl111sf_state *state)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun 	mxl_debug("()");
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	return mxl111sf_write_reg_mask(state, 0x17, 0x40, 0x00);
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun /* initialize TSIF as input port of MxL1X1SF for MPEG2 data transfer */
mxl111sf_config_mpeg_in(struct mxl111sf_state * state,unsigned int parallel_serial,unsigned int msb_lsb_1st,unsigned int clock_phase,unsigned int mpeg_valid_pol,unsigned int mpeg_sync_pol)106*4882a593Smuzhiyun int mxl111sf_config_mpeg_in(struct mxl111sf_state *state,
107*4882a593Smuzhiyun 			    unsigned int parallel_serial,
108*4882a593Smuzhiyun 			    unsigned int msb_lsb_1st,
109*4882a593Smuzhiyun 			    unsigned int clock_phase,
110*4882a593Smuzhiyun 			    unsigned int mpeg_valid_pol,
111*4882a593Smuzhiyun 			    unsigned int mpeg_sync_pol)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun 	int ret;
114*4882a593Smuzhiyun 	u8 mode, tmp;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	mxl_debug("(%u,%u,%u,%u,%u)", parallel_serial, msb_lsb_1st,
117*4882a593Smuzhiyun 		  clock_phase, mpeg_valid_pol, mpeg_sync_pol);
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	/* Enable PIN MUX */
120*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, V6_PIN_MUX_MODE_REG, V6_ENABLE_PIN_MUX);
121*4882a593Smuzhiyun 	mxl_fail(ret);
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	/* Configure MPEG Clock phase */
124*4882a593Smuzhiyun 	mxl111sf_read_reg(state, V6_MPEG_IN_CLK_INV_REG, &mode);
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun 	if (clock_phase == TSIF_NORMAL)
127*4882a593Smuzhiyun 		mode &= ~V6_INVERTED_CLK_PHASE;
128*4882a593Smuzhiyun 	else
129*4882a593Smuzhiyun 		mode |= V6_INVERTED_CLK_PHASE;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, V6_MPEG_IN_CLK_INV_REG, mode);
132*4882a593Smuzhiyun 	mxl_fail(ret);
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	/* Configure data input mode, MPEG Valid polarity, MPEG Sync polarity
135*4882a593Smuzhiyun 	 * Get current configuration */
136*4882a593Smuzhiyun 	ret = mxl111sf_read_reg(state, V6_MPEG_IN_CTRL_REG, &mode);
137*4882a593Smuzhiyun 	mxl_fail(ret);
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	/* Data Input mode */
140*4882a593Smuzhiyun 	if (parallel_serial == TSIF_INPUT_PARALLEL) {
141*4882a593Smuzhiyun 		/* Disable serial mode */
142*4882a593Smuzhiyun 		mode &= ~V6_MPEG_IN_DATA_SERIAL;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 		/* Enable Parallel mode */
145*4882a593Smuzhiyun 		mode |= V6_MPEG_IN_DATA_PARALLEL;
146*4882a593Smuzhiyun 	} else {
147*4882a593Smuzhiyun 		/* Disable Parallel mode */
148*4882a593Smuzhiyun 		mode &= ~V6_MPEG_IN_DATA_PARALLEL;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 		/* Enable Serial Mode */
151*4882a593Smuzhiyun 		mode |= V6_MPEG_IN_DATA_SERIAL;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 		/* If serial interface is chosen, configure
154*4882a593Smuzhiyun 		   MSB or LSB order in transmission */
155*4882a593Smuzhiyun 		ret = mxl111sf_read_reg(state,
156*4882a593Smuzhiyun 					V6_MPEG_INOUT_BIT_ORDER_CTRL_REG,
157*4882a593Smuzhiyun 					&tmp);
158*4882a593Smuzhiyun 		mxl_fail(ret);
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 		if (msb_lsb_1st == MPEG_SER_MSB_FIRST_ENABLED)
161*4882a593Smuzhiyun 			tmp |= V6_MPEG_SER_MSB_FIRST;
162*4882a593Smuzhiyun 		else
163*4882a593Smuzhiyun 			tmp &= ~V6_MPEG_SER_MSB_FIRST;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 		ret = mxl111sf_write_reg(state,
166*4882a593Smuzhiyun 					 V6_MPEG_INOUT_BIT_ORDER_CTRL_REG,
167*4882a593Smuzhiyun 					 tmp);
168*4882a593Smuzhiyun 		mxl_fail(ret);
169*4882a593Smuzhiyun 	}
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	/* MPEG Sync polarity */
172*4882a593Smuzhiyun 	if (mpeg_sync_pol == TSIF_NORMAL)
173*4882a593Smuzhiyun 		mode &= ~V6_INVERTED_MPEG_SYNC;
174*4882a593Smuzhiyun 	else
175*4882a593Smuzhiyun 		mode |= V6_INVERTED_MPEG_SYNC;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	/* MPEG Valid polarity */
178*4882a593Smuzhiyun 	if (mpeg_valid_pol == 0)
179*4882a593Smuzhiyun 		mode &= ~V6_INVERTED_MPEG_VALID;
180*4882a593Smuzhiyun 	else
181*4882a593Smuzhiyun 		mode |= V6_INVERTED_MPEG_VALID;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, V6_MPEG_IN_CTRL_REG, mode);
184*4882a593Smuzhiyun 	mxl_fail(ret);
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	return ret;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun 
mxl111sf_init_i2s_port(struct mxl111sf_state * state,u8 sample_size)189*4882a593Smuzhiyun int mxl111sf_init_i2s_port(struct mxl111sf_state *state, u8 sample_size)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun 	static struct mxl111sf_reg_ctrl_info init_i2s[] = {
192*4882a593Smuzhiyun 		{0x1b, 0xff, 0x1e}, /* pin mux mode, Choose 656/I2S input */
193*4882a593Smuzhiyun 		{0x15, 0x60, 0x60}, /* Enable I2S */
194*4882a593Smuzhiyun 		{0x17, 0xe0, 0x20}, /* Input, MPEG MODE USB,
195*4882a593Smuzhiyun 				       Inverted 656 Clock, I2S_SOFT_RESET,
196*4882a593Smuzhiyun 				       0 : Normal operation, 1 : Reset State */
197*4882a593Smuzhiyun #if 0
198*4882a593Smuzhiyun 		{0x12, 0x01, 0x00}, /* AUDIO_IRQ_CLR (Overflow Indicator) */
199*4882a593Smuzhiyun #endif
200*4882a593Smuzhiyun 		{0x00, 0xff, 0x02}, /* Change to Control Page */
201*4882a593Smuzhiyun 		{0x26, 0x0d, 0x0d}, /* I2S_MODE & BT656_SRC_SEL for FPGA only */
202*4882a593Smuzhiyun 		{0x00, 0xff, 0x00},
203*4882a593Smuzhiyun 		{0,    0,    0}
204*4882a593Smuzhiyun 	};
205*4882a593Smuzhiyun 	int ret;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	mxl_debug("(0x%02x)", sample_size);
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	ret = mxl111sf_ctrl_program_regs(state, init_i2s);
210*4882a593Smuzhiyun 	if (mxl_fail(ret))
211*4882a593Smuzhiyun 		goto fail;
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, V6_I2S_NUM_SAMPLES_REG, sample_size);
214*4882a593Smuzhiyun 	mxl_fail(ret);
215*4882a593Smuzhiyun fail:
216*4882a593Smuzhiyun 	return ret;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun 
mxl111sf_disable_i2s_port(struct mxl111sf_state * state)219*4882a593Smuzhiyun int mxl111sf_disable_i2s_port(struct mxl111sf_state *state)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun 	static struct mxl111sf_reg_ctrl_info disable_i2s[] = {
222*4882a593Smuzhiyun 		{0x15, 0x40, 0x00},
223*4882a593Smuzhiyun 		{0,    0,    0}
224*4882a593Smuzhiyun 	};
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	mxl_debug("()");
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	return mxl111sf_ctrl_program_regs(state, disable_i2s);
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun 
mxl111sf_config_i2s(struct mxl111sf_state * state,u8 msb_start_pos,u8 data_width)231*4882a593Smuzhiyun int mxl111sf_config_i2s(struct mxl111sf_state *state,
232*4882a593Smuzhiyun 			u8 msb_start_pos, u8 data_width)
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun 	int ret;
235*4882a593Smuzhiyun 	u8 tmp;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	mxl_debug("(0x%02x, 0x%02x)", msb_start_pos, data_width);
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	ret = mxl111sf_read_reg(state, V6_I2S_STREAM_START_BIT_REG, &tmp);
240*4882a593Smuzhiyun 	if (mxl_fail(ret))
241*4882a593Smuzhiyun 		goto fail;
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 	tmp &= 0xe0;
244*4882a593Smuzhiyun 	tmp |= msb_start_pos;
245*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, V6_I2S_STREAM_START_BIT_REG, tmp);
246*4882a593Smuzhiyun 	if (mxl_fail(ret))
247*4882a593Smuzhiyun 		goto fail;
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	ret = mxl111sf_read_reg(state, V6_I2S_STREAM_END_BIT_REG, &tmp);
250*4882a593Smuzhiyun 	if (mxl_fail(ret))
251*4882a593Smuzhiyun 		goto fail;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	tmp &= 0xe0;
254*4882a593Smuzhiyun 	tmp |= data_width;
255*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, V6_I2S_STREAM_END_BIT_REG, tmp);
256*4882a593Smuzhiyun 	mxl_fail(ret);
257*4882a593Smuzhiyun fail:
258*4882a593Smuzhiyun 	return ret;
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun 
mxl111sf_config_spi(struct mxl111sf_state * state,int onoff)261*4882a593Smuzhiyun int mxl111sf_config_spi(struct mxl111sf_state *state, int onoff)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun 	u8 val;
264*4882a593Smuzhiyun 	int ret;
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	mxl_debug("(%d)", onoff);
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, 0x00, 0x02);
269*4882a593Smuzhiyun 	if (mxl_fail(ret))
270*4882a593Smuzhiyun 		goto fail;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	ret = mxl111sf_read_reg(state, V8_SPI_MODE_REG, &val);
273*4882a593Smuzhiyun 	if (mxl_fail(ret))
274*4882a593Smuzhiyun 		goto fail;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	if (onoff)
277*4882a593Smuzhiyun 		val |= 0x04;
278*4882a593Smuzhiyun 	else
279*4882a593Smuzhiyun 		val &= ~0x04;
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, V8_SPI_MODE_REG, val);
282*4882a593Smuzhiyun 	if (mxl_fail(ret))
283*4882a593Smuzhiyun 		goto fail;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, 0x00, 0x00);
286*4882a593Smuzhiyun 	mxl_fail(ret);
287*4882a593Smuzhiyun fail:
288*4882a593Smuzhiyun 	return ret;
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun 
mxl111sf_idac_config(struct mxl111sf_state * state,u8 control_mode,u8 current_setting,u8 current_value,u8 hysteresis_value)291*4882a593Smuzhiyun int mxl111sf_idac_config(struct mxl111sf_state *state,
292*4882a593Smuzhiyun 			 u8 control_mode, u8 current_setting,
293*4882a593Smuzhiyun 			 u8 current_value, u8 hysteresis_value)
294*4882a593Smuzhiyun {
295*4882a593Smuzhiyun 	int ret;
296*4882a593Smuzhiyun 	u8 val;
297*4882a593Smuzhiyun 	/* current value will be set for both automatic & manual IDAC control */
298*4882a593Smuzhiyun 	val = current_value;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	if (control_mode == IDAC_MANUAL_CONTROL) {
301*4882a593Smuzhiyun 		/* enable manual control of IDAC */
302*4882a593Smuzhiyun 		val |= IDAC_MANUAL_CONTROL_BIT_MASK;
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 		if (current_setting == IDAC_CURRENT_SINKING_ENABLE)
305*4882a593Smuzhiyun 			/* enable current sinking in manual mode */
306*4882a593Smuzhiyun 			val |= IDAC_CURRENT_SINKING_BIT_MASK;
307*4882a593Smuzhiyun 		else
308*4882a593Smuzhiyun 			/* disable current sinking in manual mode */
309*4882a593Smuzhiyun 			val &= ~IDAC_CURRENT_SINKING_BIT_MASK;
310*4882a593Smuzhiyun 	} else {
311*4882a593Smuzhiyun 		/* disable manual control of IDAC */
312*4882a593Smuzhiyun 		val &= ~IDAC_MANUAL_CONTROL_BIT_MASK;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 		/* set hysteresis value  reg: 0x0B<5:0> */
315*4882a593Smuzhiyun 		ret = mxl111sf_write_reg(state, V6_IDAC_HYSTERESIS_REG,
316*4882a593Smuzhiyun 					 (hysteresis_value & 0x3F));
317*4882a593Smuzhiyun 		mxl_fail(ret);
318*4882a593Smuzhiyun 	}
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	ret = mxl111sf_write_reg(state, V6_IDAC_SETTINGS_REG, val);
321*4882a593Smuzhiyun 	mxl_fail(ret);
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun 	return ret;
324*4882a593Smuzhiyun }
325