Commit 2af04244 authored by Brad Love's avatar Brad Love Committed by Mauro Carvalho Chehab

media: cx231xx: Add second i2c demod client

Include ability to add a i2c device style frontend to cx231xx USB
bridge. All current boards set to use frontend[0]. Changes are
backwards compatible with current behaviour.
Signed-off-by: default avatarBrad Love <brad@nextdimension.cc>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent bdaacc32
...@@ -68,7 +68,7 @@ struct cx231xx_dvb { ...@@ -68,7 +68,7 @@ struct cx231xx_dvb {
struct dmx_frontend fe_hw; struct dmx_frontend fe_hw;
struct dmx_frontend fe_mem; struct dmx_frontend fe_mem;
struct dvb_net net; struct dvb_net net;
struct i2c_client *i2c_client_demod; struct i2c_client *i2c_client_demod[2];
struct i2c_client *i2c_client_tuner; struct i2c_client *i2c_client_tuner;
}; };
...@@ -616,7 +616,12 @@ static void unregister_dvb(struct cx231xx_dvb *dvb) ...@@ -616,7 +616,12 @@ static void unregister_dvb(struct cx231xx_dvb *dvb)
i2c_unregister_device(client); i2c_unregister_device(client);
} }
/* remove I2C demod */ /* remove I2C demod */
client = dvb->i2c_client_demod; client = dvb->i2c_client_demod[1];
if (client) {
module_put(client->dev.driver->owner);
i2c_unregister_device(client);
}
client = dvb->i2c_client_demod[0];
if (client) { if (client) {
module_put(client->dev.driver->owner); module_put(client->dev.driver->owner);
i2c_unregister_device(client); i2c_unregister_device(client);
...@@ -805,7 +810,7 @@ static int dvb_init(struct cx231xx *dev) ...@@ -805,7 +810,7 @@ static int dvb_init(struct cx231xx *dev)
goto out_free; goto out_free;
} }
dvb->i2c_client_demod = client; dvb->i2c_client_demod[0] = client;
dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL; dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
...@@ -852,7 +857,7 @@ static int dvb_init(struct cx231xx *dev) ...@@ -852,7 +857,7 @@ static int dvb_init(struct cx231xx *dev)
goto out_free; goto out_free;
} }
dvb->i2c_client_demod = client; dvb->i2c_client_demod[0] = client;
memset(&info, 0, sizeof(struct i2c_board_info)); memset(&info, 0, sizeof(struct i2c_board_info));
...@@ -1012,7 +1017,7 @@ static int dvb_init(struct cx231xx *dev) ...@@ -1012,7 +1017,7 @@ static int dvb_init(struct cx231xx *dev)
goto out_free; goto out_free;
} }
dvb->i2c_client_demod = client; dvb->i2c_client_demod[0] = client;
/* attach tuner chip */ /* attach tuner chip */
si2157_config.fe = dev->dvb->frontend[0]; si2157_config.fe = dev->dvb->frontend[0];
...@@ -1031,16 +1036,16 @@ static int dvb_init(struct cx231xx *dev) ...@@ -1031,16 +1036,16 @@ static int dvb_init(struct cx231xx *dev)
client = i2c_new_device(tuner_i2c, &info); client = i2c_new_device(tuner_i2c, &info);
if (client == NULL || client->dev.driver == NULL) { if (client == NULL || client->dev.driver == NULL) {
module_put(dvb->i2c_client_demod->dev.driver->owner); module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
i2c_unregister_device(dvb->i2c_client_demod); i2c_unregister_device(dvb->i2c_client_demod[0]);
result = -ENODEV; result = -ENODEV;
goto out_free; goto out_free;
} }
if (!try_module_get(client->dev.driver->owner)) { if (!try_module_get(client->dev.driver->owner)) {
i2c_unregister_device(client); i2c_unregister_device(client);
module_put(dvb->i2c_client_demod->dev.driver->owner); module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
i2c_unregister_device(dvb->i2c_client_demod); i2c_unregister_device(dvb->i2c_client_demod[0]);
result = -ENODEV; result = -ENODEV;
goto out_free; goto out_free;
} }
...@@ -1078,7 +1083,7 @@ static int dvb_init(struct cx231xx *dev) ...@@ -1078,7 +1083,7 @@ static int dvb_init(struct cx231xx *dev)
goto out_free; goto out_free;
} }
dvb->i2c_client_demod = client; dvb->i2c_client_demod[0] = client;
/* define general-purpose callback pointer */ /* define general-purpose callback pointer */
dvb->frontend[0]->callback = cx231xx_tuner_callback; dvb->frontend[0]->callback = cx231xx_tuner_callback;
...@@ -1122,7 +1127,7 @@ static int dvb_init(struct cx231xx *dev) ...@@ -1122,7 +1127,7 @@ static int dvb_init(struct cx231xx *dev)
goto out_free; goto out_free;
} }
dvb->i2c_client_demod = client; dvb->i2c_client_demod[0] = client;
dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL; dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
/* define general-purpose callback pointer */ /* define general-purpose callback pointer */
...@@ -1144,8 +1149,8 @@ static int dvb_init(struct cx231xx *dev) ...@@ -1144,8 +1149,8 @@ static int dvb_init(struct cx231xx *dev)
client = i2c_new_device(adapter, &info); client = i2c_new_device(adapter, &info);
if (client == NULL || client->dev.driver == NULL) { if (client == NULL || client->dev.driver == NULL) {
module_put(dvb->i2c_client_demod->dev.driver->owner); module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
i2c_unregister_device(dvb->i2c_client_demod); i2c_unregister_device(dvb->i2c_client_demod[0]);
result = -ENODEV; result = -ENODEV;
goto out_free; goto out_free;
} }
...@@ -1154,8 +1159,8 @@ static int dvb_init(struct cx231xx *dev) ...@@ -1154,8 +1159,8 @@ static int dvb_init(struct cx231xx *dev)
dev_err(dev->dev, dev_err(dev->dev,
"Failed to obtain %s tuner.\n", info.type); "Failed to obtain %s tuner.\n", info.type);
i2c_unregister_device(client); i2c_unregister_device(client);
module_put(dvb->i2c_client_demod->dev.driver->owner); module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
i2c_unregister_device(dvb->i2c_client_demod); i2c_unregister_device(dvb->i2c_client_demod[0]);
result = -ENODEV; result = -ENODEV;
goto out_free; goto out_free;
} }
...@@ -1196,7 +1201,7 @@ static int dvb_init(struct cx231xx *dev) ...@@ -1196,7 +1201,7 @@ static int dvb_init(struct cx231xx *dev)
goto out_free; goto out_free;
} }
dvb->i2c_client_demod = client; dvb->i2c_client_demod[0] = client;
dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL; dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
/* define general-purpose callback pointer */ /* define general-purpose callback pointer */
...@@ -1218,8 +1223,8 @@ static int dvb_init(struct cx231xx *dev) ...@@ -1218,8 +1223,8 @@ static int dvb_init(struct cx231xx *dev)
client = i2c_new_device(tuner_i2c, &info); client = i2c_new_device(tuner_i2c, &info);
if (client == NULL || client->dev.driver == NULL) { if (client == NULL || client->dev.driver == NULL) {
module_put(dvb->i2c_client_demod->dev.driver->owner); module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
i2c_unregister_device(dvb->i2c_client_demod); i2c_unregister_device(dvb->i2c_client_demod[0]);
result = -ENODEV; result = -ENODEV;
goto out_free; goto out_free;
} }
...@@ -1228,8 +1233,8 @@ static int dvb_init(struct cx231xx *dev) ...@@ -1228,8 +1233,8 @@ static int dvb_init(struct cx231xx *dev)
dev_err(dev->dev, dev_err(dev->dev,
"Failed to obtain %s tuner.\n", info.type); "Failed to obtain %s tuner.\n", info.type);
i2c_unregister_device(client); i2c_unregister_device(client);
module_put(dvb->i2c_client_demod->dev.driver->owner); module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
i2c_unregister_device(dvb->i2c_client_demod); i2c_unregister_device(dvb->i2c_client_demod[0]);
result = -ENODEV; result = -ENODEV;
goto out_free; goto out_free;
} }
......
...@@ -345,6 +345,7 @@ struct cx231xx_board { ...@@ -345,6 +345,7 @@ struct cx231xx_board {
/* demod related */ /* demod related */
int demod_addr; int demod_addr;
int demod_addr2;
u8 demod_xfer_mode; /* 0 - Serial; 1 - parallel */ u8 demod_xfer_mode; /* 0 - Serial; 1 - parallel */
/* GPIO Pins */ /* GPIO Pins */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment