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

[media] dvb-usb-cxusb: Geniatech T230 - resync TS FIFO after lock

This patch fix streaming issue for Geniatech T230/PT360.

Signed-off-by: CrazyCat <crazycat69@narod.ru>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>

authored by

CrazyCat and committed by
Mauro Carvalho Chehab
5fa88151 bfc303e7

+31
+26
drivers/media/usb/dvb-usb/cxusb.c
··· 369 369 return 0; 370 370 } 371 371 372 + static int cxusb_read_status(struct dvb_frontend *fe, 373 + enum fe_status *status) 374 + { 375 + struct dvb_usb_adapter *adap = (struct dvb_usb_adapter *)fe->dvb->priv; 376 + struct cxusb_state *state = (struct cxusb_state *)adap->dev->priv; 377 + int ret; 378 + 379 + ret = state->fe_read_status(fe, status); 380 + 381 + /* it need resync slave fifo when signal change from unlock to lock.*/ 382 + if ((*status & FE_HAS_LOCK) && (!state->last_lock)) { 383 + mutex_lock(&state->stream_mutex); 384 + cxusb_streaming_ctrl(adap, 1); 385 + mutex_unlock(&state->stream_mutex); 386 + } 387 + 388 + state->last_lock = (*status & FE_HAS_LOCK) ? 1 : 0; 389 + return ret; 390 + } 391 + 372 392 static void cxusb_d680_dmb_drain_message(struct dvb_usb_device *d) 373 393 { 374 394 int ep = d->props.generic_bulk_ctrl_endpoint; ··· 1391 1371 } 1392 1372 1393 1373 st->i2c_client_tuner = client_tuner; 1374 + 1375 + /* hook fe: need to resync the slave fifo when signal locks. */ 1376 + mutex_init(&st->stream_mutex); 1377 + st->last_lock = 0; 1378 + st->fe_read_status = adap->fe_adap[0].fe->ops.read_status; 1379 + adap->fe_adap[0].fe->ops.read_status = cxusb_read_status; 1394 1380 1395 1381 return 0; 1396 1382 }
+5
drivers/media/usb/dvb-usb/cxusb.h
··· 37 37 struct i2c_client *i2c_client_tuner; 38 38 39 39 unsigned char data[MAX_XFER_SIZE]; 40 + 41 + struct mutex stream_mutex; 42 + u8 last_lock; 43 + int (*fe_read_status)(struct dvb_frontend *fe, 44 + enum fe_status *status); 40 45 }; 41 46 42 47 #endif