Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] rtl28xxu: enable demod ADC only when needed

Enable integrated demod ADC only when demod is used. Keep integrated
demod ADC disabled when external demod is used. This fixes corrupted
stream in a case external demod was used.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

authored by

Antti Palosaari and committed by
Mauro Carvalho Chehab
698f6260 b936d166

+25 -12
+25 -12
drivers/media/usb/dvb-usb-v2/rtl28xxu.c
··· 1201 1201 if (ret) 1202 1202 goto err; 1203 1203 1204 - mdelay(5); 1205 - 1206 - /* enable ADC */ 1207 - ret = rtl28xx_wr_reg_mask(d, SYS_DEMOD_CTL, 0x48, 0x48); 1208 - if (ret) 1209 - goto err; 1210 - 1211 1204 /* streaming EP: clear stall & reset */ 1212 1205 ret = rtl28xx_wr_regs(d, USB_EPA_CTL, "\x00\x00", 2); 1213 1206 if (ret) ··· 1212 1219 } else { 1213 1220 /* GPIO4=1 */ 1214 1221 ret = rtl28xx_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x10, 0x10); 1215 - if (ret) 1216 - goto err; 1217 - 1218 - /* disable ADC */ 1219 - ret = rtl28xx_wr_reg_mask(d, SYS_DEMOD_CTL, 0x00, 0x48); 1220 1222 if (ret) 1221 1223 goto err; 1222 1224 ··· 1227 1239 } 1228 1240 1229 1241 return ret; 1242 + err: 1243 + dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret); 1244 + return ret; 1245 + } 1246 + 1247 + static int rtl2832u_frontend_ctrl(struct dvb_frontend *fe, int onoff) 1248 + { 1249 + struct dvb_usb_device *d = fe_to_d(fe); 1250 + int ret; 1251 + u8 val; 1252 + 1253 + dev_dbg(&d->udev->dev, "%s: fe=%d onoff=%d\n", __func__, fe->id, onoff); 1254 + 1255 + /* control internal demod ADC */ 1256 + if (fe->id == 0 && onoff) 1257 + val = 0x48; /* enable ADC */ 1258 + else 1259 + val = 0x00; /* disable ADC */ 1260 + 1261 + ret = rtl28xx_wr_reg_mask(d, SYS_DEMOD_CTL, val, 0x48); 1262 + if (ret) 1263 + goto err; 1264 + 1265 + return 0; 1230 1266 err: 1231 1267 dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret); 1232 1268 return ret; ··· 1479 1467 .size_of_priv = sizeof(struct rtl28xxu_priv), 1480 1468 1481 1469 .power_ctrl = rtl2832u_power_ctrl, 1470 + .frontend_ctrl = rtl2832u_frontend_ctrl, 1482 1471 .i2c_algo = &rtl28xxu_i2c_algo, 1483 1472 .read_config = rtl2832u_read_config, 1484 1473 .frontend_attach = rtl2832u_frontend_attach,