[media] cx231xx: convert to use an explicit i2c mux core
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>
This commit is contained in:
parent
58d7b541dd
commit
05e0dfd031
3 changed files with 34 additions and 29 deletions
|
@ -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]);
|
||||
|
|
|
@ -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_register(struct cx231xx *dev, int mux_no)
|
||||
int cx231xx_i2c_mux_create(struct cx231xx *dev)
|
||||
{
|
||||
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])
|
||||
dev_warn(dev->dev,
|
||||
"i2c mux %d register FAILED\n", mux_no);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
void cx231xx_i2c_mux_unregister(struct cx231xx *dev, int mux_no)
|
||||
int cx231xx_i2c_mux_register(struct cx231xx *dev, int mux_no)
|
||||
{
|
||||
i2c_del_mux_adapter(dev->i2c_mux_adap[mux_no]);
|
||||
dev->i2c_mux_adap[mux_no] = NULL;
|
||||
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 rc;
|
||||
}
|
||||
|
||||
void cx231xx_i2c_mux_unregister(struct cx231xx *dev)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue