[media] rtl2832: improve slave TS control
authorAntti Palosaari <crope@iki.fi>
Fri, 5 Feb 2016 20:26:30 +0000 (18:26 -0200)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Thu, 3 Mar 2016 12:26:49 +0000 (09:26 -0300)
Add callback parameter to select enable / disable slave TS and use
it when slave demod is in use.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/dvb-frontends/rtl2832.c
drivers/media/dvb-frontends/rtl2832.h
drivers/media/usb/dvb-usb-v2/rtl28xxu.c

index c2469fb42f128bad54aaaf64a54acf85d80a9811..8c6971121ed5c3c7bcde2b1ca9b54fd822d12572 100644 (file)
@@ -347,6 +347,10 @@ static int rtl2832_init(struct dvb_frontend *fe)
 
        dev_dbg(&client->dev, "\n");
 
+       ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
+       if (ret)
+               goto err;
+
        for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
                ret = rtl2832_wr_demod_reg(dev, rtl2832_initial_regs[i].reg,
                        rtl2832_initial_regs[i].value);
@@ -491,11 +495,6 @@ static int rtl2832_set_frontend(struct dvb_frontend *fe)
        if (fe->ops.tuner_ops.set_params)
                fe->ops.tuner_ops.set_params(fe);
 
-       /* PIP mode related */
-       ret = rtl2832_bulk_write(client, 0x192, "\x00\x0f\xff", 3);
-       if (ret)
-               goto err;
-
        /* If the frontend has get_if_frequency(), use it */
        if (fe->ops.tuner_ops.get_if_frequency) {
                u32 if_freq;
@@ -1081,37 +1080,46 @@ static struct i2c_adapter *rtl2832_get_i2c_adapter(struct i2c_client *client)
        return dev->i2c_adapter_tuner;
 }
 
-static int rtl2832_enable_slave_ts(struct i2c_client *client)
+static int rtl2832_slave_ts_ctrl(struct i2c_client *client, bool enable)
 {
        struct rtl2832_dev *dev = i2c_get_clientdata(client);
        int ret;
 
-       dev_dbg(&client->dev, "\n");
-
-       ret = rtl2832_bulk_write(client, 0x10c, "\x5f\xff", 2);
-       if (ret)
-               goto err;
-
-       ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
-       if (ret)
-               goto err;
-
-       ret = rtl2832_bulk_write(client, 0x0bc, "\x18", 1);
-       if (ret)
-               goto err;
-
-       ret = rtl2832_bulk_write(client, 0x192, "\x7f\xf7\xff", 3);
-       if (ret)
-               goto err;
-
-       /* soft reset */
-       ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
-       if (ret)
-               goto err;
+       dev_dbg(&client->dev, "enable=%d\n", enable);
 
-       ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
-       if (ret)
-               goto err;
+       if (enable) {
+               ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
+               if (ret)
+                       goto err;
+               ret = rtl2832_bulk_write(client, 0x10c, "\x5f\xff", 2);
+               if (ret)
+                       goto err;
+               ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
+               if (ret)
+                       goto err;
+               ret = rtl2832_bulk_write(client, 0x0bc, "\x18", 1);
+               if (ret)
+                       goto err;
+               ret = rtl2832_bulk_write(client, 0x192, "\x7f\xf7\xff", 3);
+               if (ret)
+                       goto err;
+       } else {
+               ret = rtl2832_bulk_write(client, 0x192, "\x00\x0f\xff", 3);
+               if (ret)
+                       goto err;
+               ret = rtl2832_bulk_write(client, 0x0bc, "\x08", 1);
+               if (ret)
+                       goto err;
+               ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x0);
+               if (ret)
+                       goto err;
+               ret = rtl2832_bulk_write(client, 0x10c, "\x00\x00", 2);
+               if (ret)
+                       goto err;
+               ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
+               if (ret)
+                       goto err;
+       }
 
        return 0;
 err:
@@ -1267,7 +1275,7 @@ static int rtl2832_probe(struct i2c_client *client,
        /* setup callbacks */
        pdata->get_dvb_frontend = rtl2832_get_dvb_frontend;
        pdata->get_i2c_adapter = rtl2832_get_i2c_adapter;
-       pdata->enable_slave_ts = rtl2832_enable_slave_ts;
+       pdata->slave_ts_ctrl = rtl2832_slave_ts_ctrl;
        pdata->pid_filter = rtl2832_pid_filter;
        pdata->pid_filter_ctrl = rtl2832_pid_filter_ctrl;
        pdata->bulk_read = rtl2832_bulk_read;
index c29a4c2bf71ab1debcce9d71f0fee93d82627442..6390af64cf4511128d28d71014a239efa7aaf73d 100644 (file)
@@ -31,7 +31,7 @@
  * @tuner: Used tuner model.
  * @get_dvb_frontend: Get DVB frontend.
  * @get_i2c_adapter: Get I2C adapter.
- * @enable_slave_ts: Enable slave TS IF.
+ * @slave_ts_ctrl: Control slave TS interface.
  * @pid_filter: Set PID to PID filter.
  * @pid_filter_ctrl: Control PID filter.
  */
@@ -53,7 +53,7 @@ struct rtl2832_platform_data {
 
        struct dvb_frontend* (*get_dvb_frontend)(struct i2c_client *);
        struct i2c_adapter* (*get_i2c_adapter)(struct i2c_client *);
-       int (*enable_slave_ts)(struct i2c_client *);
+       int (*slave_ts_ctrl)(struct i2c_client *, bool);
        int (*pid_filter)(struct dvb_frontend *, u8, u16, int);
        int (*pid_filter_ctrl)(struct dvb_frontend *, int);
 /* private: Register access for SDR module use only */
index c4c6e92e8643c0f782617d534ec60b08ddfc01ce..fa72642d41f3a43177ab1eb0f887cbbb41b0cb5c 100644 (file)
@@ -1571,19 +1571,19 @@ static int rtl28xxu_frontend_ctrl(struct dvb_frontend *fe, int onoff)
        if (dev->chip_id == CHIP_ID_RTL2831U)
                return 0;
 
-       /* control internal demod ADC */
-       if (fe->id == 0 && onoff)
-               val = 0x48; /* enable ADC */
-       else
-               val = 0x00; /* disable ADC */
-
-       ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, val, 0x48);
-       if (ret)
-               goto err;
+       if (fe->id == 0) {
+               /* control internal demod ADC */
+               if (onoff)
+                       val = 0x48; /* enable ADC */
+               else
+                       val = 0x00; /* disable ADC */
 
-       /* bypass slave demod TS through master demod */
-       if (fe->id == 1 && onoff) {
-               ret = pdata->enable_slave_ts(dev->i2c_client_demod);
+               ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, val, 0x48);
+               if (ret)
+                       goto err;
+       } else if (fe->id == 1) {
+               /* bypass slave demod TS through master demod */
+               ret = pdata->slave_ts_ctrl(dev->i2c_client_demod, onoff);
                if (ret)
                        goto err;
        }