[media] cx231xx: convert to use an explicit i2c mux core
[cascardo/linux.git] / drivers / media / usb / cx231xx / cx231xx-i2c.c
index a29c345..473cd34 100644 (file)
@@ -557,40 +557,41 @@ int cx231xx_i2c_unregister(struct cx231xx_i2c *bus)
  * cx231xx_i2c_mux_select()
  * switch i2c master number 1 between port1 and port3
  */
-static int cx231xx_i2c_mux_select(struct i2c_adapter *adap,
-                       void *mux_priv, u32 chan_id)
+static int cx231xx_i2c_mux_select(struct i2c_mux_core *muxc, u32 chan_id)
 {
-       struct cx231xx *dev = mux_priv;
+       struct cx231xx *dev = i2c_mux_priv(muxc);
 
        return cx231xx_enable_i2c_port_3(dev, chan_id);
 }
 
+int cx231xx_i2c_mux_create(struct cx231xx *dev)
+{
+       dev->muxc = i2c_mux_alloc(&dev->i2c_bus[1].i2c_adap, dev->dev, 2, 0, 0,
+                                 cx231xx_i2c_mux_select, NULL);
+       if (!dev->muxc)
+               return -ENOMEM;
+       dev->muxc->priv = dev;
+       return 0;
+}
+
 int cx231xx_i2c_mux_register(struct cx231xx *dev, int mux_no)
 {
-       struct i2c_adapter *i2c_parent = &dev->i2c_bus[1].i2c_adap;
-       /* what is the correct mux_dev? */
-       struct device *mux_dev = dev->dev;
-
-       dev->i2c_mux_adap[mux_no] = i2c_add_mux_adapter(i2c_parent,
-                               mux_dev,
-                               dev /* mux_priv */,
-                               0,
-                               mux_no /* chan_id */,
-                               0 /* class */,
-                               &cx231xx_i2c_mux_select,
-                               NULL);
-
-       if (!dev->i2c_mux_adap[mux_no])
+       int rc;
+
+       rc = i2c_mux_add_adapter(dev->muxc,
+                                0,
+                                mux_no /* chan_id */,
+                                0 /* class */);
+       if (rc)
                dev_warn(dev->dev,
                         "i2c mux %d register FAILED\n", mux_no);
 
-       return 0;
+       return rc;
 }
 
-void cx231xx_i2c_mux_unregister(struct cx231xx *dev, int mux_no)
+void cx231xx_i2c_mux_unregister(struct cx231xx *dev)
 {
-       i2c_del_mux_adapter(dev->i2c_mux_adap[mux_no]);
-       dev->i2c_mux_adap[mux_no] = NULL;
+       i2c_mux_del_adapters(dev->muxc);
 }
 
 struct i2c_adapter *cx231xx_get_i2c_adap(struct cx231xx *dev, int i2c_port)
@@ -603,9 +604,9 @@ struct i2c_adapter *cx231xx_get_i2c_adap(struct cx231xx *dev, int i2c_port)
        case I2C_2:
                return &dev->i2c_bus[2].i2c_adap;
        case I2C_1_MUX_1:
-               return dev->i2c_mux_adap[0];
+               return dev->muxc->adapter[0];
        case I2C_1_MUX_3:
-               return dev->i2c_mux_adap[1];
+               return dev->muxc->adapter[1];
        default:
                return NULL;
        }