diff options
Diffstat (limited to 'drivers/media/pci/ngene/ngene-core.c')
-rw-r--r-- | drivers/media/pci/ngene/ngene-core.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/media/pci/ngene/ngene-core.c b/drivers/media/pci/ngene/ngene-core.c index a63f019fb62f..526d0adfa427 100644 --- a/drivers/media/pci/ngene/ngene-core.c +++ b/drivers/media/pci/ngene/ngene-core.c @@ -1408,6 +1408,7 @@ static void release_channel(struct ngene_channel *chan) { struct dvb_demux *dvbdemux = &chan->demux; struct ngene *dev = chan->dev; + struct i2c_client *client; if (chan->running) set_transfer(chan, 0); @@ -1424,6 +1425,16 @@ static void release_channel(struct ngene_channel *chan) if (chan->fe) { dvb_unregister_frontend(chan->fe); + + /* release I2C client (tuner) if needed */ + client = chan->i2c_client[0]; + if (chan->i2c_client_fe && client) { + module_put(client->dev.driver->owner); + i2c_unregister_device(client); + chan->i2c_client[0] = NULL; + client = NULL; + } + dvb_frontend_detach(chan->fe); chan->fe = NULL; } @@ -1459,6 +1470,7 @@ static int init_channel(struct ngene_channel *chan) chan->users = 0; chan->type = io; chan->mode = chan->type; /* for now only one mode */ + chan->i2c_client_fe = 0; /* be sure this is set to zero */ if (io & NGENE_IO_TSIN) { chan->fe = NULL; |