[media] rtl28xxu: fix DVB FE callback
authorAntti Palosaari <crope@iki.fi>
Wed, 17 Dec 2014 05:55:41 +0000 (02:55 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 3 Feb 2015 18:20:46 +0000 (16:20 -0200)
DVB FE callback functionality went broken after I moved tuners to
demod muxed I2C adapter. That happens because driver state was
carried by I2C adapter and when mux is used there is one adapter
more in a chain.
USB adapter <-> I2C adapter <-> muxed I2C adapter

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

index 0d37d0c..1f29307 100644 (file)
@@ -740,8 +740,23 @@ static int rtl2832u_tuner_callback(struct dvb_usb_device *d, int cmd, int arg)
 static int rtl2832u_frontend_callback(void *adapter_priv, int component,
                int cmd, int arg)
 {
-       struct i2c_adapter *adap = adapter_priv;
-       struct dvb_usb_device *d = i2c_get_adapdata(adap);
+       struct i2c_adapter *adapter = adapter_priv;
+       struct device *parent = adapter->dev.parent;
+       struct i2c_adapter *parent_adapter;
+       struct dvb_usb_device *d;
+
+       /*
+        * All tuners are connected to demod muxed I2C adapter. We have to
+        * resolve its parent adapter in order to get handle for this driver
+        * private data. That is a bit hackish solution, GPIO or direct driver
+        * callback would be better...
+        */
+       if (parent != NULL && parent->type == &i2c_adapter_type)
+               parent_adapter = to_i2c_adapter(parent);
+       else
+               return -EINVAL;
+
+       d = i2c_get_adapdata(parent_adapter);
 
        dev_dbg(&d->udev->dev, "%s: component=%d cmd=%d arg=%d\n",
                        __func__, component, cmd, arg);