[media] cx231xx: convert to use an explicit i2c mux core
authorPeter Rosin <peda@axentia.se>
Wed, 20 Apr 2016 06:42:17 +0000 (08:42 +0200)
committerWolfram Sang <wsa@the-dreams.de>
Fri, 22 Apr 2016 13:00:17 +0000 (15:00 +0200)
Allocate an explicit i2c mux core to handle parent and child adapters
etc. Update the select op to be in terms of the i2c mux core instead
of the child adapter.

Tested-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Peter Rosin <peda@axentia.se>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/media/usb/cx231xx/cx231xx-core.c
drivers/media/usb/cx231xx/cx231xx-i2c.c
drivers/media/usb/cx231xx/cx231xx.h

index f497888d94bfdf748b90ecf495f709c29f112e9b..f7aac2abd7831c58b5e5c2118fc0756e0db3eff3 100644 (file)
@@ -1304,6 +1304,9 @@ int cx231xx_dev_init(struct cx231xx *dev)
        cx231xx_i2c_register(&dev->i2c_bus[1]);
        cx231xx_i2c_register(&dev->i2c_bus[2]);
 
+       errCode = cx231xx_i2c_mux_create(dev);
+       if (errCode < 0)
+               return errCode;
        cx231xx_i2c_mux_register(dev, 0);
        cx231xx_i2c_mux_register(dev, 1);
 
@@ -1426,8 +1429,7 @@ EXPORT_SYMBOL_GPL(cx231xx_dev_init);
 void cx231xx_dev_uninit(struct cx231xx *dev)
 {
        /* Un Initialize I2C bus */
-       cx231xx_i2c_mux_unregister(dev, 1);
-       cx231xx_i2c_mux_unregister(dev, 0);
+       cx231xx_i2c_mux_unregister(dev);
        cx231xx_i2c_unregister(&dev->i2c_bus[2]);
        cx231xx_i2c_unregister(&dev->i2c_bus[1]);
        cx231xx_i2c_unregister(&dev->i2c_bus[0]);
index a29c345b027ddf0b4424f94e4017514b9be53465..473cd3433fe5d44b378c084dd7d6fb9ac53a693f 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;
        }
index 69f6d20870f5ed9f98dfced23ec8dbc3d688be0f..90c867683076017f818a81d6db15dfb0c97adb95 100644 (file)
@@ -624,6 +624,7 @@ struct cx231xx {
 
        /* I2C adapters: Master 1 & 2 (External) & Master 3 (Internal only) */
        struct cx231xx_i2c i2c_bus[3];
+       struct i2c_mux_core *muxc;
        struct i2c_adapter *i2c_mux_adap[2];
 
        unsigned int xc_fw_load_done:1;
@@ -760,8 +761,9 @@ int cx231xx_reset_analog_tuner(struct cx231xx *dev);
 void cx231xx_do_i2c_scan(struct cx231xx *dev, int i2c_port);
 int cx231xx_i2c_register(struct cx231xx_i2c *bus);
 int cx231xx_i2c_unregister(struct cx231xx_i2c *bus);
+int cx231xx_i2c_mux_create(struct cx231xx *dev);
 int cx231xx_i2c_mux_register(struct cx231xx *dev, int mux_no);
-void cx231xx_i2c_mux_unregister(struct cx231xx *dev, int mux_no);
+void cx231xx_i2c_mux_unregister(struct cx231xx *dev);
 struct i2c_adapter *cx231xx_get_i2c_adap(struct cx231xx *dev, int i2c_port);
 
 /* Internal block control functions */